opengl - 如何将固定功能 Material 和光照传递给片段着色器?

标签 opengl 3d shader fragment-shader

我正在向我的 OpenGL 2.1/GLSL 1.2 应用程序添加顶点和片段着色器。

顶点着色器:

#version 120

void main(void)  
{    
    gl_Position = ftransform();
    gl_FrontColor = gl_Color;
}

片段着色器:

#version 120

void main(void) 
{   
    if (/* test some condition */) {
        discard;
    } else {
        gl_FragColor = gl_Color;
    }
}

问题是,如果条件失败,gl_FragColor 只会设置为我的固定函数方法中最后一次调用 gl.glColor3f() 的值。

相反,我想传递源自 Material 和光照参数的法线颜色。例如,这个:

gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_AMBIENT, lightingAmbient, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, lightingDiffuse, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPECULAR, lightingSpecular, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, directionalLightFront, 0);

gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, materialAmbient, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, materialDiffuse, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, materialSpecular, 0);
gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_EMISSION, materialEmissive, 0);
gl.glMaterialf(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, shininess);

有没有办法将此值分配给 gl_FragColor?或者我是否需要在片段着色器中从头开始实现照明?

(请注意,我并没有尝试使用任何类型的高级照明技术。我正在使用着色器进行裁剪,并且只想使用标准照明方法。)

最佳答案

不幸的是,没有办法做你想做的事。使用固定功能管道和顶点/像素着色器是相互排斥的。您渲染的每个图元都必须使用一个或另一个。

因此,您必须在着色器中自己进行光照计算。 This tutorial提供了您需要这样做的所有代码。由于它对每个像素而不是每个顶点进行光照计算,因此结果实际上看起来要好得多!

关于opengl - 如何将固定功能 Material 和光照传递给片段着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19189491/

相关文章:

unity3d - 在 Unity 3D 中旋转对象

java - LWJGL 3、VAO 和 Shader 不渲染

android - 使用目标 GL_TEXTURE_2D 在纹理上渲染相机预览

unix - 调整图像大小(jpeg 或解压缩图像)

opengl - 在 OpenGL 中绘制莫比乌斯带

graphics - 在 Mathematica 中使用 Graphics3D 的线条样式

linux - 使用pm3d函数填充数据

c++ - Opengl 照明照亮了错误的表面

python - 有没有一种方法可以更快地渲染点 OpenGL

opengl - 条件语句会减慢着色器的速度吗?