Opengl 从顶点位置绘制圆形splat
我想画圆形splat,但是我唯一的数据是顶点位置。所以我在C++中画出了点,它们出现在正确的位置。我的点大小设置为20像素,因此这些点足够大,可以丢弃一些像素以得到一个圆 我想我可以将顶点像素位置从顶点着色器发送到片段着色器,然后计算片段位置和顶点位置之间的距离。这将导致圆形飞溅,但其中大部分将被隐藏。我做错了什么 CG顶点着色器:Opengl 从顶点位置绘制圆形splat,opengl,shader,fragment-shader,vertex-shader,cg,Opengl,Shader,Fragment Shader,Vertex Shader,Cg,我想画圆形splat,但是我唯一的数据是顶点位置。所以我在C++中画出了点,它们出现在正确的位置。我的点大小设置为20像素,因此这些点足够大,可以丢弃一些像素以得到一个圆 我想我可以将顶点像素位置从顶点着色器发送到片段着色器,然后计算片段位置和顶点位置之间的距离。这将导致圆形飞溅,但其中大部分将被隐藏。我做错了什么 CG顶点着色器: void main( float4 pvec: POSITION, uniform float4x4 modelView, uniform
void main(
float4 pvec: POSITION,
uniform float4x4 modelView,
uniform float4x4 modelViewIT,
uniform float4x4 modelViewProj,
uniform float2 wsize,
uniform float near,
uniform float top,
uniform float bottom,
out float4 pout: POSITION,
out float4 color: COLOR,
out float2 vpos: TEXCOORD0
)
{
//position of point correctly projected
pout = mul(modelViewProj, pvec);
vpos = float2((pout.xy * 0.5 + 0.5) * wsize);
color = float4(0.0, 0.0, 1.0, 1.0);
}
void main(
float4 col : COLOR,
float2 wpos : WPOS,
float2 vpos: TEXCOORD0,
uniform float2 unproj_scale,
uniform float2 unproj_offset,
uniform float f_near,
uniform float zb_scale,
uniform float zb_offset,
uniform float epsilon,
out float4 colorout : COLOR
)
{
float xDiff = abs(vpos.x - wpos.x);
float yDiff = abs(vpos.y - wpos.y);
if ((xDiff * xDiff + yDiff * yDiff) > 20.0) {
col.r = 1.0;
}
colorout = col;
}
CG片段着色器:
void main(
float4 pvec: POSITION,
uniform float4x4 modelView,
uniform float4x4 modelViewIT,
uniform float4x4 modelViewProj,
uniform float2 wsize,
uniform float near,
uniform float top,
uniform float bottom,
out float4 pout: POSITION,
out float4 color: COLOR,
out float2 vpos: TEXCOORD0
)
{
//position of point correctly projected
pout = mul(modelViewProj, pvec);
vpos = float2((pout.xy * 0.5 + 0.5) * wsize);
color = float4(0.0, 0.0, 1.0, 1.0);
}
void main(
float4 col : COLOR,
float2 wpos : WPOS,
float2 vpos: TEXCOORD0,
uniform float2 unproj_scale,
uniform float2 unproj_offset,
uniform float f_near,
uniform float zb_scale,
uniform float zb_offset,
uniform float epsilon,
out float4 colorout : COLOR
)
{
float xDiff = abs(vpos.x - wpos.x);
float yDiff = abs(vpos.y - wpos.y);
if ((xDiff * xDiff + yDiff * yDiff) > 20.0) {
col.r = 1.0;
}
colorout = col;
}
从顶点着色器计算屏幕空间中的位置时,请记住图形管道执行所谓的透视分割,以将剪辑空间中的点
(x,y,z,w)
转换为标准化设备坐标(x/w,y/w,z/w,1)
。只有这样,位置才会在[-1,1]
范围内,并且您到屏幕空间的转换是正确的。在计算屏幕空间中的位置时,您缺少透视分割;)那是对的。。谢谢:)