2013-07-25 51 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查詢這些位置。