我只是GLSL的菜鸟,并且不知道如何在GLSL中这样做。
我想做的是在球体中心将alpha值设为1,然后在外部逐渐降低。
所以我使用Blender节点编辑器创建了一个原型,这就是我的工作方式。
现在我想在glsl中这样做。
也许我可以使用gl_Normal替换"正常几何"在Blender上。
(虽然它在版本140之后被删除,但我的最终目标只是" make"它,所以忽略它。)
并且还有点函数来计算矢量数学上的点积"在glsl上。
现在我需要的是#34;查看相机数据的矢量"和" ColorRamp"。
我认为" ColorRamp"可以用混合和sin函数完成,
但不知道如何获取相机数据的矢量"
我已经阅读了this,了解它是什么,但不知道如何获得。
那么我怎样才能获得#34;查看相机数据的矢量"?
答案 0 :(得分:1)
没有深度,着色器很简单:
// Vertex
varying vec2 pos; // fragment position in world space
void main()
{
pos=gl_Vertex.xy;
gl_Position=ftransform();
}
// Fragment
varying vec2 pos;
uniform vec4 sphere; // sphere center and radius (x,y,z,r)
void main()
{
float r,z;
r=length(pos-sphere.xy); // radius = 2D distance to center (ignoring z)
if (r>sphere.a) discard; // throw away fragments outside sphere
r=0.2*(1.0-(r/sphere[3])); // color gradient from 2D radius ...
gl_FragColor=vec4(r,r,r,1.0);
}
是的,您也可以使用gl_ModelViewProjectionMatrix * gl_Vertex;
代替ftransform()
。正如你所看到的,我使用了世界坐标所以我不需要使用半径缩放...如果你还需要gl_FragDepth
制作这个3D,那么你必须在屏幕空间中工作,这要复杂得多,我我懒得去试试。无论如何,将渐变颜色更改为您喜欢的颜色。
C ++中的渲染是这样完成的:
void gl_draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLint id;
float aspect=float(xs)/float(ys);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0/aspect,aspect,0.1,100.0);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(15.0,0.0,1.0,0.0);
glTranslatef(1.0,1.0,-10.0);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
float xyzr[4]={ 0.7,0.3,-5.0,1.5 };
// GL 1.0 circle for debug
int e; float a,x,y,z;
glBegin(GL_LINE_STRIP);
for (a=0.0,e=1;e;a+=0.01*M_PI)
{
if (a>=2.0*M_PI) { e=0; a=2.0*M_PI; }
x=xyzr[0]+(xyzr[3]*cos(a));
y=xyzr[1]+(xyzr[3]*sin(a));
z=xyzr[2];
glVertex3f(x,y,z);
}
glEnd();
// GLSL sphere
glUseProgram(prog_id);
id=glGetUniformLocation(prog_id,"sphere"); glUniform4fv(id,1,xyzr);
glBegin(GL_QUADS);
glColor3f(1,1,1);
glVertex3f(xyzr[0]-xyzr[3],xyzr[1]-xyzr[3],xyzr[2]);
glVertex3f(xyzr[0]+xyzr[3],xyzr[1]-xyzr[3],xyzr[2]);
glVertex3f(xyzr[0]+xyzr[3],xyzr[1]+xyzr[3],xyzr[2]);
glVertex3f(xyzr[0]-xyzr[3],xyzr[1]+xyzr[3],xyzr[2]);
glEnd();
glUseProgram(0);
glFlush();
SwapBuffers(hdc);
}
结果:
白色是调试 GL 1.0 圈,看看两者是否放在同一个地方。更改渐变以符合您的需求。我没有使用透明度,所以如果你需要它,可以更改alpha组件并启用/设置 BLEND 。
xs,ys
是我的GL窗口的分辨率。 xyzr
是你的领域{ x,y,z,r }
定义。希望我没有忘记复制一些东西。这段代码和答案充分利用了(所以如果我错过了什么,请查看更多信息):