2013-10-24 70 views
2

使用着色器我想着色一個平面,以便它複製紋理上的像素。紋理是32x32像素,平面的尺寸也是32x32的空間座標。基於紋理像素着色平面

有誰知道我會如何檢查紋理上的第一個像素,然後用它在飛機上着色第一個方塊(1x1)?

生成的紋理例如:(初像素是紅色的目的)
enter image description here

該代碼使用一個具有座標VEC2(0,0)作爲我預期不起作用。我認爲在(0,0)的顏色是紅色,但它不是,它是綠色的:

vec4 color = texture2D(texture, vec2(0, 0)); 

我想有我失蹤,或不理解有關的Texture2D的東西(0,0)沒有按」 t看起來也是結束像素。

如果有人能夠幫助我,它會非常appriciated。謝謝。


編輯:
感謝您的意見和解答!使用此代碼,它的工作現在:

// Flip the texture vertically 
vec3 verpos2 = verpos.xyz * vec3(1.0, 1.0, -1.0); 

// Calculate the pixel coordinates the fragment belongs to 
float pixX = floor(verpos2.x - floor(verpos2.x/32.0) * 32.0); 
float pixZ = floor(verpos2.z - floor(verpos2.z/32.0) * 32.0); 

float texX = (pixX + 0.5)/32.0; 
float texZ = (pixZ + 0.5)/32.0; 

gl_FragColor = texture2D(texture, vec2(texX, texZ)); 

這就是說,我在與每個「塊」的邊緣鋸齒線的問題。在我看來,像我的數學是關閉的,它對雙方應該是什麼顏色感到困惑,因爲當只使用頂點顏色時,我沒有這個問題。任何人都可以看到我出錯的地方或者它可以做得更好嗎?
再次感謝!

enter image description here

+0

如果您有GL-ES 3.0,您可以使用['texelFetch'](http://www.khronos.org/opengles/sdk/docs/manglsl/xhtml/texelFetch.xml)。否則,[this](http://stackoverflow.com/questions/5879403/opengl-texture-coordinates-in-pixel-space)答案可能會有所幫助。 –

+0

感謝您的鏈接。顯然,WebGL不支持texelFetch,所以不幸的是我不能使用它:( –

+2

我相信OpenGL ES的座標系從左下角開始 - 在iOS上,有時需要垂直翻轉圖像。 –

回答

2

是......作爲本虔誠在評論中提到,記得在WebGL的左下角顯示0,0。

此外,爲索引到您的紋理,嘗試從每個像素的「中間」進行採樣。在一個32×32源紋理,讓像素(0,0)你會想:

texture2D(theSampler, vec2(0.5/32.0, 0.5/32.0)); 

或者更一般地說,

texture2D(theSampler, vec2((xPixelIndex + 0.5)/width, (yPixelIndex + 0.5)/height); 

這只是如果你明確地訪問紋理像素;如果你獲得插值並從頂點着色器(例如a(-1,-1)到(1,1)平方)傳遞並通過變化vec2((x + 1)/ 2,(y + 1)/2)添加到片段着色器中),則此「每個像素的中間值」會反映在您的變化值中。

但它可能只是像本說的Y-up。 :)

+0

再次感謝回答:P你和Ben Pious說了什麼,現在它在工作,但是鋸齒線有問題。如果你願意再次幫助我,我編輯了我的問題。 :) –

+0

回到辦公室,我會說:「請修復原始錯誤並修復新問題」:-) 我不完全確定您的新代碼在做什麼,但可能全部地板等都不需要;他們可能會阻礙WebGL的插值。你可以試試texture2D(texture,vec2(verpos2.x,verpos2.z));它看起來像是在範圍0..31? –

+1

現在明白了。謝謝大衛。 :) –

相關問題