2016-08-22 48 views
-1

我试图让α越大,像素距离光源越远。给定世界坐标(统一)与当前像素在GLSL中呈现的距离?

如何计算我的光源(u_lightSourcePosition)和正在渲染的像素之间的距离?

我试着这样做:

float distance_from_point_to_pixel = distance(gl_FragCoord,v_lightSourcePosition) 

,但没有奏效。

顶点着色器

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

varying vec4 v_color; 
varying vec2 v_texCoord0; 
varying vec2 v_lightSourcePosition; 


uniform mat4 u_projTrans; 
uniform vec2 u_lightSourcePosition; 

void main() { 
    vec4 position = u_projTrans * vec4(a_position, 1.0); 
    gl_Position = position; 
    v_color = a_color; 
    v_texCoord0 = a_texCoord0; 
    v_lightSourcePosition = u_lightSourcePosition ; 

} 

片段着色器

varying vec4 v_color; 
varying vec2 v_texCoord0; 

varying vec2 v_lightSourcePosition; 

uniform sampler2D u_sampler2D; 


void main() { 
    vec4 color = texture2D(u_sampler2D, v_texCoord0) * v_color; 
    float lightRadius = 400.0; 
    float distance_from_point_to_pixel = distance(gl_FragCoord,v_lightSourcePosition); 
    color.a = distance_from_point_to_pixel/lightRadius; 
    gl_FragColor = color; 
} 
+0

'length(current - uniform_point)'?请添加着色器,否则我们只能猜测... – BDL

+0

对不起,第一次发布。我添加了着色器和一些更多信息。 – alawiii521

+0

很可能你的观点不在同一个空间。 'gl_FragCoord'是NDC,它可能不是计算距离的最佳空间。很可能你必须分割你的变换,并将包含世界空间位置的变化传递给片段着色器。顺便说一句:你为​​什么要在变化中复制制服而不是在片段着色器中访问制服? – BDL

回答

0

您需要的片段的世界空间。将其从顶点着色器传递到像素着色器作为另一个vec3,您可能需要传入world/model矩阵以将a_position从对象空间转换为世界空间。 vec3 pworld = (model * vec4(a_position,1.0)).xyz;

+0

我是glsl的新手。什么是世界/模型矩阵? – alawiii521

+0

简而言之,世界/模型矩阵是您在世界空间中设置模型/网格的位置+方向+大小的矩阵。您可以通过以下公式计算模型/网格的世界/模型矩阵:'worldMatrix = translationMatrix * rotationMatrix * scalingMatrix'。这里'translationMatrix'是表示世界空间中模型/网格的翻译的矩阵。 'rotationMatrix'是表示世界空间中模型/网格旋转的矩阵。 'scalingMatrix'是代表模型/网格尺度的矩阵。 –

+0

如果你不知道你的模型矩阵是什么,那么你可以用正则矩阵代替正确的矩阵......但是你想给所有的顶点着色器提供矩阵,这样你就可以把它们带入正确的视图空间。 单位矩阵仅仅是... '1,0,0,0' '0,1,0,0' '0,0,1,0' '0,0,0,1 ' –