Opengl - 纹理映射到三角形

时间:2014-05-20 12:30:00

标签: c++ opengl texture-mapping

要将图像作为纹理应用于由两个三角形组成的矩形,我正在按照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函数。

2 个答案:

答案 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)

查看您在其中一条评论中发布的图片后:

enter image description here

我认为这不是纹理坐标的问题。你可以告诉"对角线"图像中出现的图像与四边形的对角线不匹配,就像你想要的一些纹理坐标混合在一起。

最可能的原因是图像数据与您在glTexImage2D()调用中指定的尺寸不匹配,或者行对齐存在问题。