2010-10-12 10 views
0

我在GLSL紋理地獄:我在片段着色器中加載統一sampler2D變量中相同大小的4種不同紋理,並嘗試使用不同的紋理座標訪問它們:GLSL使用不同texCoord(iPad)的多紋理查找

uniform sampler2D image0, image1, image2, image3; 
varying highp vec2 texCoord; 

void main() 
{ 
highp vec2 tc = vec2(texCoord.x, mod(1.0-texCoord.y, 0.2) + 0.2); 

lowp vec4 color0 = texture2D(image0, tc); 
lowp vec4 color1 = texture2D(image1, tc); 
lowp vec4 color2 = texture2D(image2, tc); 
lowp vec4 color3 = texture2D(image3, tc); 

if (texCoord.y < 0.2) { gl_FragColor = color0; } 
else if (texCoord.y < 0.4) { gl_FragColor = color1; } 
else if (texCoord.y < 0.6) { gl_FragColor = color2; } 
else if (texCoord.y < 0.8) { gl_FragColor = color3; } 
else { gl_FragColor = vec4(0.0); } 
} 

的texCoord來自課程的頂點着色器:

uniform lowp float ratio; 
attribute highp vec4 vertex; 
varying highp vec2 texCoord; 

void main() 
{ 
gl_Position = vertex; 
texCoord.x = ((vertex.x * 0.5) + 0.5) * ratio; 
texCoord.y = (vertex.y * 0.5) + 0.5; 
} 

我得到5個獨立片,從image0,圖像2(!!不是圖像1),圖像3,圖像3(又來了!),和黑色(這將保持各種紋理的融合,在這種情況下不重要,我的概率lem首先獲得正確的紋理)。我的圖像加載代碼多次檢查,我做負載4種不同的圖片:

- (void)linkTexture:(GLenum)tex image:(Image *)image varName:(const char *)varName 
{ 
GLint texLocation; 

texLocation = glGetUniformLocation(program, varName); 
glUniform1i(texLocation, tex-GL_TEXTURE0); 
glActiveTexture(tex); 
glBindTexture(GL_TEXTURE_2D, image->texID); 
} 

進一步回落:

loadTexture("new_york_0.jpg", &image0, &renderer); 
    [self linkTexture:GL_TEXTURE0 image:&image0 varName:"image0"]; 

    loadTexture("new_york_1.jpg", &image1, &renderer); 
    [self linkTexture:GL_TEXTURE1 image:&image1 varName:"image1"]; 

    loadTexture("new_york_2.jpg", &image2, &renderer); 
    [self linkTexture:GL_TEXTURE2 image:&image2 varName:"image2"]; 

    loadTexture("new_york_3.jpg", &image3, &renderer); 
    [self linkTexture:GL_TEXTURE3 image:&image3 varName:"image3"]; 

一定有什麼東西在我期待的GPU來查找紋理的方式非常錯誤的但我不知道它是什麼。

有人能發光嗎?

回答

4

那麼在第一種情況下,你會從同一紋理中獲得5片。

想想你在做什麼。

取一個0.6的y座標。

(1 - 0.6)  = 0.4 
mod(0.4, 0.2) = 0.0 
0.0 + 0.2  = 0.2 

基本上你強制y座標在0.2到0.4的範圍內,這將永遠是image1。我不知道你爲什麼看到image2,但...

至於第二種情況......這嚴重暗示你收到的紋理座標是錯誤的。所以..你想向我們展示頂點着色器以及這個片段着色器嗎?

我必須承認,雖然,我不明白你爲什麼不乾脆把5片成一個單一的口感和僅僅是使其...

你可能想看看這個:

http://www.vis.uni-stuttgart.de/glsldevil/index.html#downloads

+0

+1,雖然我認爲image1沒有顯示是採樣器設置代碼中的一個簡單錯誤(因此爲什麼我們在未註釋的代碼中看到image2) – Bahbar 2010-10-12 14:28:33

+0

噢,我的噢,我的,你當然是對的,那是爲什麼我每次都看到圖片1,這對我來說很愚蠢。我已經修復了這部分,並且在每個切片中看到不同的圖像,但不是正確的,我將編輯該問題以詳細說明如何加載圖像。 – 2010-10-12 15:16:45

+0

一個想法,爲什麼我沒有看到正確的紋理?任何人?我已經看過這段代碼很久了,我可能會錯過另一個明顯的錯誤,但我看不到它。 – 2010-10-13 06:29:58

0

glUniform1i修改當前程序的統一值。確保您在調用linkTexture之前調用glUseProgram(myProgram)。