【发布时间】:2017-12-04 10:12:44
【问题描述】:
我目前正在尝试学习 opengl,在此过程中,我遇到了一个需要澄清的问题。所以基本上,我被告知顶点着色器适用于每个顶点一次。我不太确定它如何知道有多少数据构成一个顶点,因为我给着色器的所有内容基本上都是一个包含一堆浮点数的缓冲区。
考虑以下代码:
GLuint vbo = 0;
glGenBuffer(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,7 * 3 * sizeof(GLfloat), NULL, GL_STATIC_DRAW);
glSubData(GL_ARRAY_BUFFER,0,3*3*sizeof(GLfloat),vertices);
glSubData(GL_ARRAY_BUFFER,3*3*sizeof(GLfloat),4*3*sizeof(GLfloat),colors);
GLuint pos = glGetAttribLocation(programId, "position");
GLuint col = glGetAttribLocation(programId, "color");
glVertexAttribPointer(pos,3,GL_FLOAT,GL_FALSE,0,0);
glVertexAttribPointer(col,4,GL_FLOAT,GL_FALSE,0,3*3*sizeof(GLfloat));
glEnableVertexAttribArray(pos);
glEnableVertexAttribArray(col);
glUseProgram(programId);
glDrawArray(GL_TRIANGLE,0,3);
这只是为了绘制一个简单的三角形,因此着色器只是在片段着色器上声明 gl_position 和输出颜色。请考虑我的顶点着色器将有一个名为位置的变量,而我的片段着色器有一个名为颜色的变量。
现在,我不明白的问题是我从未在 vbo 中指定我的顶点的终点。结果,opengl怎么知道它应该只看vbo中的前9个float位置,而不是去vbo中的color rgba规范。
【问题讨论】: