gpt4 book ai didi

c++ - GLSL - GLSL 1.2 中的统一位置和着色器中的深度测试

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:02 25 4
gpt4 key购买 nike

两个问题:

  1. 我正在使用不同着色器在大型 VBO 中渲染元素。在 GLSL 1.2 中,如果我是正确的,我必须使用它,因为它是 OSX 上的最新版本不支持统一位置,我假设这意味着你的属性的位置是编译器决定的。有没有办法解决?例如,当我的 VBO 使用交错 (x,y,z,nx,ny,nz,texU,texV) 时,我需要多个着色器才能每次都在同一位置访问这些属性。然而,我发现编译器给了它们不同的位置,导致该位置成为法线,等等。我需要它们的位置与我的 VBO 属性位置一致。

  2. 我刚刚完成了我的第一个 GLSL 渲染,它看起来就像我忘记启用深度测试,各种多边形渲染在彼此之上。我启用了深度测试:

    glEnable(GL_DEPTH_TEST);

    问题依然存在。有没有不同的方法来使用着色器启用它们?我以为深度缓冲区会处理这个问题?

    问题 2 已解决。原来是一个 SFML 问题,我需要在创建窗口时指定 OpenGL 设置。

最佳答案

属性位置在 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 的含义等。

关于c++ - GLSL - GLSL 1.2 中的统一位置和着色器中的深度测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11705924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com