2014-01-24 170 views
1

我正在嘗試製作一個照明系統,程序更改紋理(塊)的亮度取決於它獲取的光線,程序會爲玩家可見的每個塊(紋理)執行此操作。GLSL渲染紋理錯誤

但是,照明系統的工作原理非常完美,但是在使用着色器進行渲染時,一切都會變得糟糕起來。

此代碼是在渲染循環 -

float light = Lighting.checkLight(mapPosY, mapPosX, this); // Returns the light the current block gets 
map[mapPos].light = light; // Applies the light to the block 
Shaders.block.setUniformf("lightBlock", light); // Sets the light value to the shader's uniform, to change the brightness of the current block/texture. 

batch.draw(map[mapPos].TEXTURE, (mapPosX * Block.WIDTH), (mapPosY * Block.HEIGHT), Block.WIDTH, Block.HEIGHT); // Renders the block/texture to the screen. 

結果是相當隨機..
正如我說的頭兩行很好地工作,問題可能是在三線或着色器本身。

着色器:
頂點着色器 -

attribute vec4 a_color; 
attribute vec3 a_position; 
attribute vec2 a_texCoord0; 

uniform mat4 u_projTrans; 

varying vec4 vColor; 
varying vec2 vTexCoord; 

void main() { 
    vColor = a_color; 
    vTexCoord = a_texCoord0; 
    gl_Position = u_projTrans * vec4(a_position, 1.0f); 
} 

片段着色器 -

varying vec4 vColor; 
varying vec2 vTexCoord; 

uniform vec2 screenSize; 

uniform sampler2D tex; 
uniform float lightBlock; 

const float outerRadius = .65, innerRadius = .4, intensity = .6; 

const float SOFTNESS = 0.6; 

void main() { 

    vec4 texColor = texture2D(tex, vTexCoord) * vColor; 

    vec2 relativePosition = gl_FragCoord.xy/screenSize - .5; 

    float len = length(relativePosition); 

    float vignette = smoothstep(outerRadius, innerRadius, len); 

    texColor.rgb = mix(texColor.rgb, texColor.rgb * vignette * lightBlock, intensity); 

    gl_FragColor = texColor; 
} 
+0

爲什麼downvote?問題很好.. – Israelg99

+1

你確定問題是沒有正確傳遞給片段着色器的制服嗎?您是否嘗試過使用這個變量(即:硬編碼值)?我沒有關於libgdx的任何信息,但是你的程序似乎很簡單... –

+0

@PedroBoechat是的,我現在玩了兩天的值,而且它仍然看起來像制服沒有正確傳遞到片段shader ..如果你說着色器很好,它可以幫助我很多,因爲現在我知道我不應該搜索這個修補程序。 – Israelg99

回答

0

我固定的問題..但我沒有任何想法,爲什麼它固定它。
感謝佩德羅,我更專注於渲染循環而不是着色器本身。

環路之前,我加入那些2線 -

List<Integer> lBlocks = new ArrayList<Integer>(); 
Shaders.block.setUniformf("lightBlock", 0.3f); 

基本上我創建一個數組來存儲稍後明亮塊。
我將着色器的制服設置爲0.3f,這意味着很暗。值應該是0-1f。

在渲染循環

現在,裏面的 -

float light = Lighting.checkLight(mapPosY, mapPosX, this); 
map[mapPos].light = light; 
if(light == 1.0f) { 
    lBlocks.add(mapPos); 
} else { 
    batch.draw(map[mapPos].TEXTURE, (mapPosX * Block.WIDTH), (mapPosY * Block.HEIGHT), Block.WIDTH, Block.HEIGHT); 
} 

正如你所看到的,明亮的塊我添加到陣列和黑暗勢力渲染我,我設置了統一的前到0.3f儘可能在第一個代碼示例中渲染循環。

渲染循環後,我再次通過明亮的塊..因爲我們沒有渲染它們。

Shaders.block.setUniformf("lightBlock", 1.0f); 
    for(int i = 0; i < lBlocks.size(); i++) { 
     batch.draw(map[lBlocks.get(i)].TEXTURE, ((lBlocks.get(i) % width) * Block.WIDTH), ((lBlocks.get(i)/width) * Block.HEIGHT), Block.WIDTH, Block.HEIGHT); 
    } 

現在我提出了明亮的塊,它的工作..結果是好的。
但是我不知道爲什麼會這樣,它就像將渲染環切割成兩個,一個用於暗塊,一個用於明亮的塊。

謝謝:)