xBA*_*ACP 5 opengl cocoa nsopenglview
这是交易.如果我将代码保留为glGenBuffers(1,vertexBuffers),代码编译就可以了.但是,我认为它应该是2,因为vertexBuffers的大小为2.
我错过了什么吗?
代码如下:
-(void)drawRect:(NSRect)dirtyRect
{
// get program ID for shader program
GLuint programID = [self loadShaders];
// get new dimensions
NSSize dim = [self frame].size;
// clear the background with color
glClearColor(0.0, 0.0, 0.0, 0.4);
glDepthRange(0.1, 100.0);
glViewport(0, 0, dim.width, dim.height);
glClear(GL_COLOR_BUFFER_BIT);
// vertex data
GLfloat vertexPositionData[] = {-dim.width/2, -dim.height/2, 0.0, 5.0,
dim.width/2, -dim.height/2, 0.0, 5.0,
0.0, dim.height/2, 0.0, 5.0};
GLfloat vertexColorData[] = {1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 1.0, 0.5};
GLfloat scaleMatrixData[] = {1/(dim.width/2), 0.0, 0.0, 0.0,
0.0, 1/(dim.height/2), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0};
GLint scaleMatrixUniform = glGetUniformLocation(programID, "scaleMatrix");
// generate a buffer for our triangle
glGenBuffers(1, vertexBuffers);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositionData), vertexPositionData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColorData), vertexColorData, GL_STATIC_DRAW);
//glBindBuffer(GL_ARRAY_BUFFER, 0);
glUseProgram(programID);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[0]);
glEnableVertexAttribArray(VERTEX_POS_INDEX);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffers[1]);
glEnableVertexAttribArray(VERTEX_COLOR_INDEX);
glVertexAttribPointer(VERTEX_POS_INDEX, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE, 0, vertexPositionData);
glVertexAttribPointer(VERTEX_COLOR_INDEX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE, 0, vertexColorData);
glUniformMatrix4fv(scaleMatrixUniform, 1, GL_FALSE, scaleMatrixData);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);
// flush buffer
glFlush();
[[self openGLContext] flushBuffer];
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*Tim 22
glGenBuffers不像你期望的那样工作.当你打电话时glGenBuffers,它实际上并没有创造任何东西.它只返回当前未用作缓冲区名称的整数列表.
在您致电之前,不会创建实际的"对象" glBindBuffer.所以你可以组成你喜欢的任何整数并将它传递给glBindBuffer,并在该索引处创建一个有效的缓冲区.glGenBuffers实际上根本不需要它,它只是作为一个便利函数给你一个未使用的整数.
因此,如果您只是创建一个随机整数数组,只要它们都不重叠,您就可以将其用作缓冲区列表而无需调用glGenBuffers.这就是为什么你的代码无论你告诉glGenBuffers创建1个还是2个缓冲区的原因.只要您有两个具有两个不同名称的缓冲区,整数来自何处都无关紧要.
一点点演示:
int buf;
glGenBuffers(1, &buf);
glIsBuffer(buf); //FALSE - buffer has not been created yet
glBindBuffer(GL_ARRAY_BUFFER, buf);
glIsBuffer(buf); //TRUE - buffer created on bind
Run Code Online (Sandbox Code Playgroud)
假设vertexBuffers声明为:
GLuint vertexBuffers[2];
Run Code Online (Sandbox Code Playgroud)
那么你的代码可能不是你想的那样.第一个参数glGenBuffers()是要生成的缓冲区数,第二个参数是指向多个缓冲区数组的指针.所以你可能想做:
glGenBuffers (2, vertexBuffers);
Run Code Online (Sandbox Code Playgroud)
这告诉OpenGL生成2个缓冲区名称,并将它们存储在内存中的2个连续位置,从地址开始vertexBuffers.
| 归档时间: |
|
| 查看次数: |
13283 次 |
| 最近记录: |