2013-07-25 54 views
0

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

质地之前应用:enter image description here

应用后质地:enter image description here

一些示例代码:

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); 

编辑:全平局()功能

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"; 
+0

上面的示例是整个源代码吗?请张贴整个'Draw()'代码和生成顶点/纹理坐标的部分 –

+0

我编辑了问题以显示包括顶点和纹理坐标在内的整个绘制代码。 –

回答

0

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

0

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

下一个犯罪嫌疑人是MyMatrix及其具有的值。它似乎有一个unnessary翻译。也许你有一些代码来居中并失败?

编辑1:矩形的边是2个单位,即从屏幕中心向所有方向扩展1个单位。当为投影和模型视图矩阵使用单位矩阵时,这样的矩形将精确地覆盖整个屏幕。请尝试将您的矩阵设置为身份并验证。唯一剩下的两名嫌犯是你的正射投影不正确,否则你的视口不能覆盖整个屏幕。我想不出别的

EDIT2:在你发表在我试图在本地运行它的评论链接整个源(我已经使用JOGL但OpenGL的部分应该是相同的)。一个错误我发现(虽然它在我的系统工作,但它可能会在你被失败)是行:

glBindAttribLocation(programObject, 1, "textureCoordinate");

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

+0

我只注意到了相互矛盾的坐标,所以改变了它们,以便匹配起来。 MyMatrix是一个正交投影矩阵,所以它对四边形的整体定位没有影响,它只是对顶点坐标进行了归一化处理。 –

+0

@ D.Cole请参阅我的更新回答 –

+0

我将MyMatrix设置为单位矩阵,但仍然没有运气。我的视口设置为glViewport(0,0,mWidth,mHeight),其中mWidth和mHeight表示整个屏幕的测量值,所以我怀疑这是问题所在。不过谢谢。 –

1

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

我略有怀疑,这一部分:

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

你确定texcoord属性实际上是在位置1?

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