2014-01-24 49 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); 
    } 

现在我提出了明亮的块,它的工作..结果是好的。
但是我不知道为什么会这样,它就像将渲染环切割成两个,一个用于暗块,一个用于明亮的块。

谢谢:)