0

我想上传一个简单的纹理来覆盖我在屏幕上绘制的正方形。没有纹理的代码在屏幕中央显示一个红色方块。我正在编辑此代码以将纹理覆盖在顶部,但是每次我尝试将纹理应用到正方形时,它都会扭曲图像并在屏幕上移动。编辑:此处提供完整代码:http: //codetidy.com/6291/

应用纹理之前:在此处输入图像描述

应用纹理后:在此处输入图像描述

一些示例代码:

void init()


// Create an OpenGL 2D texture from the BOX resource.
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_SRC_COLOR); 
    glGenTextures(1, &TextureHandle);
    glBindTexture(GL_TEXTURE_2D, TextureHandle);

    // Set texture parameters.
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    maOpenGLTexImage2D(TEXTURE);

编辑:整个 draw() 函数

void draw()
    GLfloat vVertices[] = { -1.0f, 1.0f, 0.0f,
                       -1.0f, -1.0f, 0.0f,
                       1.0f, 1.0f, 0.0f,
                       1.0f, -1.0f, 0.0f
                                    };


            GLfloat TexCoord[] = {0.0, 1.0,
                    0.0, 0.0,
                    1.0, 1.0,
                    1.0, 0.0};

            // Set the viewport
            glViewport(0, 0, mWidth, mHeight);

            // Clear the color buffer
            glClear(GL_COLOR_BUFFER_BIT);

            // Use the program object
            glUseProgram(mShader);
            checkGLError("glUseProgram");

            glBindTexture(GL_TEXTURE_2D, TextureHandle);

            // Set uniform function
            glUniformMatrix4fv(mMvpLoc, 1, false, MyMatrix);
            checkGLError("glUniform4fv");

            //glActiveTexture(GL_TEXTURE0);
            glUniform1i(mTextureLoc, 0);

            // Load the vertex data, i.e attributes and quads
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
            glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, TexCoord);
            checkGLError("glVertexAttribPointer");

            glEnableVertexAttribArray(0);
            glEnableVertexAttribArray(1);
            checkGLError("glEnableVertexAttribArray");

            glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
            checkGLError("glDrawArrays");

顶点和片段着色器:

char vertexShaderSource[] =
        "attribute vec4 vPosition;   \n"
        "uniform mat4 uMvp;          \n"
        "attribute vec2 TexCoordIn;  \n"
        "varying vec2 TexCoordOut;   \n"

        "void main()                 \n"
        "{                           \n"

        "gl_Position = uMvp * vPosition; \n"
        "TexCoordOut = TexCoordIn.xy;       \n"
            "}                           \n";

        char fragmentShaderSource[] =
        "precision highp float;\n"
        "varying vec2 TexCoordOut;\n"
        "uniform sampler2D Texture;\n"

        "void main()\n"
        "{\n"

        "gl_FragColor = texture2D(Texture, TexCoordOut);\n"

        "}\n";
4

3 回答 3

1

也许您的顶点和纹理属性被交换了?

我对这部分有点怀疑:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, TexCoord);

您确定 texcoord 属性实际上位于位置 1 吗?

我建议使用glGetAttribLocation来查询这些位置。

于 2013-07-25T23:03:35.203 回答
0

虽然你的纹理坐标有点奇怪 - 你给第二个顶点(矩形的左下角)坐标 [1, 1] (你的纹理的右上角),但除此之外我在上面的代码中找不到任何错误。

下一个嫌疑人是MyMatrix它所具有的值。它似乎有一个不必要的翻译。也许您有一些代码将其居中但失败了?

Edit1:矩形的边是 2 个单位,即它从屏幕中心向各个方向扩展 1 个单位。当对投影和模型视图矩阵使用单位矩阵时,这样的矩形将完全覆盖整个屏幕。请尝试将您的矩阵设置为身份并验证。剩下的唯一两个嫌疑人要么是您的正交投影不正确,要么是您的视口没有覆盖整个屏幕。我想不出别的

Edit2:在您在评论中的链接中发布整个源代码后,我尝试在本地运行它(我使用了 JOGL,但 OpenGL 部分应该是相同的)。我发现的一个错误(尽管它在我的系统中有效,但在您的系统中可能失败)是以下行:

glBindAttribLocation(programObject, 1, "textureCoordinate");

该变量被声明为varying. 您的属性名称是inputTextureCoordinate. 除此之外,代码在我的机器上运行良好(由于环境不同,我不得不使用不同的代码来加载纹理和着色器并将所有double值转换为float)。因此,如果上述修复不能解决您的问题,请尝试禁用您可以使用的任何功能,即不要在着色器中乘以矩阵并且不要加载/绑定纹理(glColor()改用)。我会注释掉,直到我再次留下简单的红色四边形。删除的语句之一必须是失败的语句。

于 2013-07-25T15:03:17.733 回答
0

真是个愚蠢的错误!我试图整理我的代码并将我的 glBindAttributeLocation() 命令移到我的程序链接之前。这意味着顶点和纹理坐标都没有加载,因为我认为它们会在索引的 0 和 1 中。因此这使我的命令调用它们无效。非常感谢@cs的帮助,并没有完全解决问题(因此有了新的答案),但让我走上了正轨。

于 2013-07-29T09:37:18.807 回答