c++ - OpenGL 顶点数组没有显示?

标签 c++ opengl glsl

我正在尝试使用着色器和顶点数组渲染最简单的三角形,但是当我尝试绘制顶点数组时,什么也没有显示。这是代码(顺便说一句,正在调用绘制函数,我检查过):

数组创建:

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

GLfloat verts[] = { 
    0, 0, /*vertex 1*/     1, 0, 0, /*color 1*/
    0, 100, /*vertex 2*/   0, 1, 0, /*color 2*/
    100, 0, /*vertex 3*/   0, 0, 1  /*color 3*/
};
glBufferData(GL_ARRAY_BUFFER, 5 * sizeof(GLfloat) * 3, verts, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, sizeof(GLfloat) * 2, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, sizeof(GLfloat) * 3, GL_FLOAT, false, 0, 0);

glBindVertexArray(0);

数组渲染:

glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);

shader.vert

uniform float u_time;
uniform mat4 u_projMatrix;

in vec2 position;
in vec3 color;

out vec4 vertColor;
void main()
{
    gl_Position = u_projMatrix * vec4(position, 0.0, 1.0);
    vertColor = vec4(color, 1.0);
}

shader.frag

uniform float u_time;

in vec4 vertColor;
void main()
{
    gl_FragColor = vertColor;
}

投影矩阵:

glm::mat4 projection = glm::scale(glm::vec3(2.0/800.0, 2.0/600.0, 1.0));

我没有在我的程序中显示完整的代码,但是这段代码有什么明显的错误吗?

最佳答案

您没有指定步幅或偏移量。并且大小是组件的数量而不是字节的数量。

stride 是 openGL 应该为您的情况下的属性的下一组数据前进多少字节 5*sizeof(GLfloat)对于这两个属性。

offset 是属性的第一组数据所在的位置,位置是0对于颜色 2*sizeof(GLFoat) .

所以你的glVertexAttribPointer电话应该是:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, false, 5*sizeof(GLfloat), 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, false, 5*sizeof(GLfloat), 2*sizeof(GLfloat));

关于c++ - OpenGL 顶点数组没有显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26442441/

相关文章:

c - 顶点数组未被绘制

javascript - Node.js 在屏幕上绘图

c++ - 如何在现代 OpenGL 中管理模型、 View 和投影矩阵

opengl-es - getUniformLocation 返回空

c++ - 如何从模板类中的方法返回 NULL

c++ - ref-qualifier `const &&` 有什么用?

c++ - 将二进制整数 vector 转换为数字 vector

c++ - OpenCV 中的支持 vector 机 : Visual Studio 2008 reported error wrongly (or is it right? )

opengl - GLSL 照明 - 基于光半径的衰减

c++ - 从灰色到彩色对 Sprite 进行着色