GLSL - 在GLSL 1.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

基于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

属性位置在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意味着等约定。