How to pass-through fixed-function material and lighting to fragment shader?

旧城冷巷雨未停 提交于 2019-12-02 01:19:43

问题


I am adding a vertex and fragment shader to my OpenGL 2.1/GLSL 1.2 application.

Vertex shader:

#version 120

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

Fragment shader:

#version 120

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

The problem is that if the condition fails, gl_FragColor just gets set to whatever the last call to gl.glColor3f() was in my fixed-function method.

Instead, I want to pass through the normal color, derived from the material and lighting parameters. For example, this:

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);

Is there a way to assign this value to gl_FragColor? Or do I need to implement the lighting from scratch in the fragment shader?

(Note, I'm not trying to do any kind of advanced lighting techniques. I'm using the shaders for clipping purposes and want to just use standard lighting methods.)


回答1:


Unfortunately there is no way to do what you want. Using the fixed function pipeline and vertex/pixel shaders are mutually exclusive. Each primitive you render must use one or the other.

Thus, you must do the lighting computations yourself in the shader. This tutorial provides all the code you would need to do so. Since it does the lighting calculation for every pixel instead of every vertex, the results actually look far better!



来源:https://stackoverflow.com/questions/19189491/how-to-pass-through-fixed-function-material-and-lighting-to-fragment-shader

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!