如何在glsl上制作渐变球?

时间:2016-12-31 04:34:11

标签: glsl

我只是GLSL的菜鸟,并且不知道如何在GLSL中这样做。
我想做的是在球体中心将alpha值设为1,然后在外部逐渐降低。

所以我使用Blender节点编辑器创建了一个原型,这就是我的工作方式。 Sphere gradient

现在我想在glsl中这样做。
也许我可以使用gl_Normal替换"正常几何"在Blender上。
(虽然它在版本140之后被删除,但我的最终目标只是" make"它,所以忽略它。)
并且还有点函数来计算矢量数学上的点积"在glsl上。

现在我需要的是#34;查看相机数据的矢量"和" ColorRamp"。
我认为" ColorRamp"可以用混合和sin函数完成,
但不知道如何获取相机数据的矢量" 我已经阅读了this,了解它是什么,但不知道如何获得。

那么我怎样才能获得#34;查看相机数据的矢量"?

1 个答案:

答案 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);
    }

结果:

overview

白色是调试 GL 1.0 圈,看看两者是否放在同一个地方。更改渐变以符合您的需求。我没有使用透明度,所以如果你需要它,可以更改alpha组件并启用/设置 BLEND

xs,ys是我的GL窗口的分辨率。 xyzr是你的领域{ x,y,z,r }定义。希望我没有忘记复制一些东西。这段代码和答案充分利用了(所以如果我错过了什么,请查看更多信息):