2012-08-10 45 views
0

我正在嘗試編寫簡單着色器以在基本紋理(128 * 128)上放置一些「標記」(64 * 64),以指示標記必須位於何處在底紋上使用青色標記大小(64 * 64)的區域。
base image
mark image
成爲
desired resultGLSL - 將貼花紋理貼入基本紋理,並帶有顏色指示

片段着色器

precision lowp float; 

uniform sampler2D us_base_tex; 
uniform sampler2D us_mark_tex; 

varying vec2 vv_base_tex; 
varying vec2 vv_mark_tex; 

const vec4 c_mark_col = vec4(0.0, 1.0, 1.0, 1.0);//CYAN 

void main() 
{ 
vec4 base_col = texture2D(us_base_tex, vv_base_tex); 

if(base_col == c_mark_col) 
{ 
vec4 mark_col = texture2D(us_mark_tex, vv_mark_tex);//texelFetch magic overhere must be 
base_col = mix(base_col, mark_col, mark_col.a); 
} 
gl_FragColor = base_col; 
} 

當然,這不是工作,因爲它應該,我有這樣的事情(transperity僅用於演示,沒有青色區域,只有一塊「T」):
problem

我試圖找出它,只有像texelFetch這樣的東西會幫助我,但我無法弄清楚,如何獲取基本紋理青色texel的tex座標,並將其轉換爲get - 第一行/第一行青色基本texel =第一列/第一行標記紋理,第二列/第一行基底=第二列/第一行標記。等等。

+1

如果您有「標記」的圖像座標,爲什麼不能簡單地調整「T」紋理的紋理座標(和尋址模式),以便它坐在正確的位置?你使用的幾何圖形只是一個四邊形,對吧? – Ani 2012-08-10 14:56:46

+0

是的,只是四個,你的意思是改變vv_mark_tex座標?那麼尋址模式呢? 「T」是不同的紋理,我必須把它放在青色區域,我不知道青色區域的紋理位置,只有它與標記的大小相同。 – Aristarhys 2012-08-10 15:16:31

+1

讓我簡化我的問題 - 你知道青色矩形的像素/圖像座標嗎? – Ani 2012-08-10 15:56:58

回答

2

我認爲有一種方法可以一次完成此操作 - 但它涉及使用另一個能夠保存下面提供的信息的紋理。所以你會增加你的紋理內存使用量。

在這種方法中,第二紋理包含用於貼花

  1. R =歸一化距離的UV地圖從左青色正方形的(它可以通過後處理原始紋理脫機或以某種方式產生的)從青色正方形
  2. B的頂=無關
  3. G =歸一化距離

現在像素着色器是簡單的,它需要做一切以查看是否CUR租texel是青色,從「decal-uvmap」紋理中挑選R和G,並將其用作紋理座標來對貼花紋理進行取樣。

請注意,此紋理(及其大小)的位深度與原始紋理的大小有關,因此可能會使用比原始紋理小得多的「decal-uvmap」紋理。

+0

太好了,非常感謝。 – Aristarhys 2012-08-11 04:35:44