【问题标题】:Adding line to shader makes nothing draw向着色器添加线条不会绘制任何内容
【发布时间】:2020-09-30 10:03:38
【问题描述】:

我有这个顶点着色器。当我删除in vec3 LVertexNorm 以及与之相关的所有内容时。它渲染得很好。但是,如果我添加它,则不再呈现任何内容。

 #version 140

in vec3 LVertexNorm;
in vec3 LVertexPos2D;

uniform mat4 MVP;

out vec3 norm;

void main() {
    norm = LVertexNorm;
    gl_Position = MVP * vec4( LVertexPos2D.x, LVertexPos2D.y, LVertexPos2D.z, 1 );
}

片段着色器

    #version 140

in vec3 norm;
out vec4 LFragment; 
void main() { 
    LFragment = vec4( 1.0,1.0,1.0, 1.0 ); 
}

以及用于构建 VAO 的代码

    glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, verticesCount * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(program->getAttribute("LVertexPos2D"), 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, nbo);
glBufferData(GL_ARRAY_BUFFER, normalCount * sizeof(GLfloat), normals, GL_STATIC_DRAW);
glVertexAttribPointer(program->getAttribute("LVertexNorm"), 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesCount * sizeof(GLuint), indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBindVertexArray(0);

我尝试了不同的方法。并且总是相同的结果。添加 LVertexNorm 后,着色器停止工作。我不知道为什么。可能有什么问题?

【问题讨论】:

    标签: c++ opengl glsl shader vao


    【解决方案1】:

    glEnableVertexAttribArray 的参数必须是顶点属性索引:

    GLuint pos_inx = program->getAttribute("LVertexPos2D")
    glVertexAttribPointer(pos_inx, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
    glEnableVertexAttribArray(pos_inx);
    
    GLuint norm_inx = program->getAttribute("LVertexNorm");
    glVertexAttribPointer(norm_inx, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
    glEnableVertexAttribArray(norm_inx);
    

    当您有顶点着色器输入变量in vec3 LVertexNorm;in vec3 LVertexPos2D; 时,可能LVertexNorm 获得属性索引0 而LVertexPos2D 获得属性索引1。由于未启用顶点属性1,因此顶点未指定职位。
    实际上,属性索引没有指定,可以是任意数字。但是,大多数驱动程序使用从 0 开始的升序索引。

    【讨论】:

    • 啊啊。说得通。傻我:D
    猜你喜欢
    • 2014-06-12
    • 2012-10-30
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多