将OpenGL 1纹理代码转换为OpenGL 3

3
简单的问题: 这段代码是如何工作的?
glBindTexture(GL_TEXTURE_2D, texture_);
glColor4f(1,1,1,1);
glBegin(GL_QUADS);
  glTexCoord2f(0, 1);  glVertex2f(left_, top_);
  glTexCoord2f(1, 1);  glVertex2f(right_, top_);
  glTexCoord2f(1, 0);  glVertex2f(right_, bottom_);
  glTexCoord2f(0, 0);  glVertex2f(left_, bottom_);
glEnd();

如何使用顶点数组将代码转换为现代OpenGL?


1
更重要的部分是你必须为OpenGL-3提供着色器。顶点数组很容易使用,并且已经存在了很长时间,即自OpenGL-1.1以来。顶点缓冲对象是新事物,将顶点数组放置在快速内存中。 - datenwolf
2个回答

4
如果你只是想将这些代码转换为顶点数组,那么做法就很简单了:
static const float texCoords[8] = { 
    0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f };
float vertices[8] = { 
    left_, top_, right_, top_, right_, bottom_, left_, bottom_ };

glBindTexture(GL_TEXTURE_2D, texture_);
glColor4f(1,1,1,1);

glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_QUADS, 0, 4);

glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableCLientState(GL_VERTEX_ARRAY);

然而,这与现代OpenGL无关,实际上,这段代码完全是有效的OpenGL 1.1代码。现代OpenGL不仅仅是关于顶点数组和立即模式。它还涉及将顶点数据存储在顶点缓冲对象(VBO)中,并使用着色器进行每个计算(如变换、光照、纹理等),而不是旧的固定功能管线。因此,将其移植到现代OpenGL实际上并不是一个简单的问题。
由于您的问题表明您不了解所有这些内容,在这里解释也没有多大意义,因为它不仅仅是将5-10行代码替换为问题中的行。如果您想要做的就是使用顶点数组而不是立即模式,则上述代码应该足够,尽管在这个例子中它并没有什么用处。如果您想要做的是使用现代OpenGL,请参考一些严肃的现代OpenGL学习资源。

0

BindTexture会保留...但其他的不会。

在init方法中创建顶点缓冲对象(VBO)。这些顶点应该是:

float verts[4*(2+3)] = { 0, 1, left_,  top_,    0,
                         1, 1, right_, top_,    0,
                         1, 0, right_, bottom_, 0,
                         0, 1, left_,  bottom_, 0 };

将2个顶点复制到GPU(glBufferData)

使用glVertexAttribPointer设置带有属性的缓冲区数据

绘制数组

例如

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glBindBuffer(GL_ARRAY_BUFFER, bufID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*5, sizeof(float)*2);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float)*5, 0);
glDrawArrays with Triangle_strip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接