要将图像作为纹理应用于由两个三角形组成的矩形,我正在按照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函数。
答案 0 :(得分:0)
你的紫外线看起来是不正确的。尝试再次交换您的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-right (swapped)
-0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f // Bottom-left (swapped)
答案 1 :(得分:0)
查看您在其中一条评论中发布的图片后:
我认为这不是纹理坐标的问题。你可以告诉"对角线"图像中出现的图像与四边形的对角线不匹配,就像你想要的一些纹理坐标混合在一起。
最可能的原因是图像数据与您在glTexImage2D()
调用中指定的尺寸不匹配,或者行对齐存在问题。