2012-01-16 140 views
3
分辨率

我會保持它的簡單:在這篇文章的末尾列出的代碼是在頂部至底部我的項目中爲了我有一個OGLES2。 。在地方0框架,它完美地呈現不同的紋理一切當渲染一個紋理所有我看到的是正確尺寸的黑盒子的OpenGL ES 2.0:紋理呈現黑色,幾個小時不:(

這是我已經驗證:

  • 有輸出紋理字節(它的格式GL_ALPHA)它清楚地看到有零,沒有零值,所以數據看起來是正確的(或者至少不是全黑!)。

  • 紋理ID是正確的,通過使用在頂點着色器下面驗證: gl_FragColor=vec4(v_texCoord.xy,0.0,1.0); ..和觀察預期black->green->yellow->red彩色流從(0,0)->(0,1)->(1,1)->(1,0)移動能夠被看見。

  • 我的紋理具有兩個維度的功率:256 x 64,正確地反映數據陣列英寸

我會非常感謝幫助確定什麼是錯誤的,因爲經過幾個小時的谷歌搜索和刺激我很難過!

glGenTextures(1, &_textureId); 
GLint savedId; 
glGetIntegerv(GL_TEXTURE_BINDING_2D, &savedId); 
glBindTexture(GL_TEXTURE_2D, _textureId); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
GLenum datatype = -1; 
GLenum format = -1; 
switch([self pixelFormat]) { 
    case kGLTexturePixelFormat_RGBA8888: 
     format=GL_RGBA; 
     datatype=GL_UNSIGNED_BYTE; 
     break; 
    case kGLTexturePixelFormat_RGB565: 
     format=GL_RGB; 
     datatype=GL_UNSIGNED_SHORT_5_6_5; 
     break; 
    case kGLTexturePixelFormat_A8: // * This is current format, used for testing. 
     format=GL_ALPHA; 
     datatype=GL_UNSIGNED_BYTE; 
     break; 
    default: 
     [NSException raise:NSInternalInconsistencyException format:@""]; 

} 
glTexImage2D(GL_TEXTURE_2D, 0, format, [self pixelsWide], [self pixelsHigh], 0, format, datatype, [self data]); 
glBindTexture(GL_TEXTURE_2D, savedId); 
//... 
GLint s_textureId = glGetUniformLocation(program, "s_texture"); 
//... 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, [_textureAtlas textureId]); 
glUniform1i(s_textureId, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

// In vertex shader: 
attribute vec2 a_texCoord; 
varying vec2 v_texCoord; 
uniform sampler2D s_texture; 
void main() { 
    // ... 
    v_texCoord = a_texCoord; 
} 

// In fragment shader: 
varying vec2 v_texCoord; 
uniform sampler2D s_texture; 
void main() { 
    // ... 
    gl_FragColor = texture2D(s_texture, v_texCoord); 
} 

回答

6

您的代碼看起來不錯,我必須說,我所期望的輸出顏色是黑色:作爲你的質地GL_ALPHA格式,GL ES的文件說:

GL_ALPHA每個元素是一個單獨的alpha組件。的GL它 轉換爲浮點和通過附加0 用於紅色,綠色和藍色它組裝成一個RGBA元件。

所以,如果你想顯示你的阿爾法值作爲灰度顏色,你需要指示您的片段着色器這樣做:

gl_FragColor = texture2D(s_texture, v_texCoord).aaaa; 

這將在所有紅色重複的Alpha值,綠色,紅色和alpha通道。

如果你想你的輸出alpha通道保持1.0(不透明),那麼你會想:

gl_FragColor = vec4(texture2D(s_texture, v_texCoord).aaa, 1.0); 
+0

太感謝你了,你說的完全正確!我修改爲使用.aaaa,現在我可以看到我的文本:-)非常,非常感謝,有一杯啤酒。 – KomodoDave 2012-01-16 21:51:44

+0

@KomodoDave歡迎您,歡呼聲;) – rotoglup 2012-01-16 21:52:58