2012-07-29 115 views
2

兩個問題:GLSL - 在GLSL 1.2統一地點和着色器深度測試

  1. 我呈現不同的着色器在大VBO元素。在GLSL 1.2其中,如果我是正確的,因爲它是最新版本的OSX不支持統一的位置,我假設意味着你的屬性的位置是哪裏編譯程序將決定我必須使用。有沒有辦法解決?例如,我的VBO了交錯式(X,Y,Z,NX,NY,NZ,texU,texV),我需要多個着色器可以在同一個地方,每次訪問這些屬性。然而,我發現編譯器給他們不同的位置,導致位置成爲法線,等等。我需要他們的位置與我的VBO屬性位置一致。

  2. 我只是得到我的第一個GLSL渲染完成,它看起來酷似我忘了,以實現與呈現在彼此的頂部各種多邊形的深度測試。我啓用了深度測試用:

    glEnable(GL_DEPTH_TEST); 
    

    但問題依然存在。有沒有不同的方式來啓用着色器?我認爲深度緩衝區照顧這個?

    問題2解決。原來是創建窗口時需要指定OpenGL設置的SFML問題。

+0

「不支持統一的位置」這些是*屬性位置*,不是統一的位置。請更改您的問題以使用正確的條款。 – 2012-07-29 20:39:39

+0

您在第1點錯了,OSX 10.7和10.8均支持GLSL 1.50和ARB_explicit_attrib_location。 (他們似乎都支持GLSL 3.30,並且基於我的測試顯示了屬性位置,但是這沒有記錄) – 2012-07-29 21:49:49

回答

1

基於OpenGL 3.3+你VAOs,當你使用它們,你就綁定維也納組織到它,你可以定義一個定製的訂單屬性:http://www.opengl.org/sdk/docs/man3/xhtml/glEnableVertexAttribArray.xml(記住,屬性必須是連續的)

一漂亮/易實現這個可以在XNA中找到:VertexDeclaration,您可能希望看到所有的頂點*類型爲好。

上獲得V3與SFML工作的一些提示: http://en.sfml-dev.org/forums/index.php?topic=6314.0

如何創建和使用VAOs一個例子:http://www.opentk.com/files/issues/HelloGL3.cs

(它的C#,但我猜你會得到它)

更新:

在v2.1上也有它http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml,雖然你不能創建VAO。幾乎可以實現相同的功能,但每次都必須綁定屬性,因爲它將位於固定管道上。

+0

GLSL 1.2是OpenGL 2.1 - OSX上的最新版本 – 2012-07-29 01:38:51

+0

我更新了我的答案。 – Aybe 2012-07-29 01:46:45

2

屬性位置在3個地方之一規定,爲了從最高優先級到最低:

  1. 通過使用GLSL 3.30(或更高版本)或ARB_explicit_attrib_location擴展語法layout(location = #),其中#是的屬性索引。所以,如果我有一個名爲position輸入,我想給它索引3這樣的:

    layout(location = 3) in vec4 position; 
    

    這是我的首選處理此方法。 Explicit_attrib_location幾乎可以在任何仍在支持的硬件上使用(這不是Intel)。

  2. 通過glBindVertexAttrib顯式關聯。在連接程序之前,您可以在之前調用此函數。要做到這一點,我們會這樣做:

    GLuint program = glCreateProgram(); 
    glAttachShader(program, some_shader); 
    glBindVertexAttrib(program, 3, "position"); 
    glLinkProgram(program); 
    

    您可以設置多個屬性。事實上,您可以將多個屬性名稱設置爲相同的索引。這個想法是能夠自動設置一堆映射,並讓OpenGL找出哪一個與實際着色器代碼一起工作。因此,您可以將「位置」和「軸」映射到索引3,只要不將着色器放入具有這兩個輸入的系統中,就可以。

    請注意,您還可以設置不存在的屬性。您可以給「正常」一個未在着色器中指定的屬性。 這很好;鏈接器將只關心實際存在的屬性。所以,你可以建立一個複雜的約定這樣的事情,只是在鏈接前在其上運行的每個程序:

    void AttribConvention(GLuint prog) 
    { 
        glBindVertexAttrib(program, 0, "position"); 
        glBindVertexAttrib(program, 1, "color"); 
        glBindVertexAttrib(program, 2, "normal"); 
        glBindVertexAttrib(program, 3, "tangent"); 
        glBindVertexAttrib(program, 4, "bitangent"); 
        glBindVertexAttrib(program, 5, "texCoord"); 
    } 
    
    GLuint program = glCreateProgram(); 
    glAttachShader(program, some_shader); 
    AttribConvention(program); 
    glLinkProgram(program); 
    

    即使特定着色器不具有所有這些屬性,它仍然可以工作。

  3. 讓OpenGL分配它。如果您不以其他方式之一將屬性索引分配給屬性,則GLSL鏈接程序將爲您分配它。您可以使用glGetAttribLocation獲取後鏈接屬性。

    我真的不建議這樣做,因爲OpenGL將任意指定。因此,每個使用名爲position的屬性的着色器可能在不同的索引中具有該位置。我不認爲這是個好主意。所以如果你不能在着色器中明確地設置它,那麼至少在鏈接之前將它明確地設置在你的OpenGL代碼中。這樣,你可以有一個關於什麼屬性索引0意味着,什麼索引1意味着等約定。