【发布时间】:2014-07-08 17:18:03
【问题描述】:
要将图像作为纹理应用到由两个三角形组成的矩形,我正在学习 open.gl/textures 中的教程。
我正在使用 freeglut 来创建上下文,我对原始代码所做的唯一更改就是与此相关。
我希望将整个图像显示在一个矩形上,但是我得到了一个由三角形组成的矩形的图像,右侧的图像具有图像的左侧,左侧的图像具有图片的右侧。
我检查了纹理坐标(下面的代码),根据其他教程,我得出的结论是其他配置会更有意义(在下面的代码中注释)但结果更糟(黑色三角形出现)。
// Create a Vertex Buffer Object and copy the vertex data to it
GLuint vbo;
glGenBuffers(1, &vbo);
GLfloat vertices[] = {
// Position Color Texcoords
/*
-0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, // Top-left
0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, // Top-right
-0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, // Bottom-left
0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f // Bottom-righ
*/
-0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, // Top-left
0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, // Top-right
0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
-0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f // Bottom-left
};
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Create an element array
GLuint ebo;
glGenBuffers(1, &ebo);
GLuint elements[] = {
0, 1, 2,
2, 3, 0
};
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
这些是对 glVertexAttribPointer() 的调用:
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glEnableVertexAttribArray(posAttrib);
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), 0);
GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
glEnableVertexAttribArray(colAttrib);
glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
GLint texAttrib = glGetAttribLocation(shaderProgram, "texcoord");
glEnableVertexAttribArray(texAttrib);
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (void*)(5 * sizeof(GLfloat)));
我希望能得到一些帮助,以了解我做错了什么。我在 Linux 平台上,使用 g++ 编译,使用 SOIL 上传图像,使用 freeglut 创建上下文并使用 OpenGL 3 函数。
【问题讨论】:
-
我们能看到你
glVertexAttribPointer()的电话吗?或者glVertexPointer()、glColorPointer()、glTexCoordPointer(),如果您使用的是固定管道?我不确定您的顶点数据是如何排列的。您的位置是否仅使用 2 个坐标?第 3 到第 5 个组件是颜色? -
我通过调用 glVertexAttribPointer() 更新了帖子。你是对的,我使用 2 个坐标作为位置,从第 3 到第 5 个组件是颜色规格。
-
那些看起来不错。看到下面链接的图像后,我开始认为问题出在纹理上,而不是纹理坐标上。在我看来,出现的“对角线”不是四边形的对角线,对吧?可能是行填充存在某种问题,或者您为
glTexImage2D()指定的大小与图像的实际大小不匹配。颜色看起来与原始图像中的颜色相同吗?有一段时间我认为这可能是 RGB 与 RGBA 的问题,但这会严重破坏您的图像。 -
@RetoKoradi 非常感谢您的见解,我从没想过图像是问题所在。在尝试使用其他图像的代码后,结果与我发布的代码一致。
-
好的,我添加了这个作为答案。
标签: c++ opengl texture-mapping