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;
}
爲什麼downvote?問題很好.. – Israelg99
你確定問題是沒有正確傳遞給片段着色器的制服嗎?您是否嘗試過使用這個變量(即:硬編碼值)?我沒有關於libgdx的任何信息,但是你的程序似乎很簡單... –
@PedroBoechat是的,我現在玩了兩天的值,而且它仍然看起來像制服沒有正確傳遞到片段shader ..如果你說着色器很好,它可以幫助我很多,因爲現在我知道我不應該搜索這個修補程序。 – Israelg99