设置 glsl 的光泽度

Qua*_*hey 0 opengl glsl lwjgl

我如何设置 opengl 光泽度浮动,以便我可以在着色器程序中使用它gl_FrontMaterial.shininess

我尝试了这个glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100f);,但亮点并没有变小,所以我猜光泽没有改变。

编辑: 这是我使用的片段着色器程序:

varying vec4 varyingColor;
varying vec3 varyingNormal;
varying vec4 varyingVertex;
varying vec2 varyingTexCoord;
uniform sampler2D my_color_texture;
varying vec3 varyingEyeVec;

void main() {
    vec3 vertexPosition = (gl_ModelViewMatrix * varyingVertex).xyz;
    vec3 surfaceNormal = normalize((gl_NormalMatrix * varyingNormal).xyz);
    vec3 lightDirection = normalize(gl_LightSource[0].position.xyz - vertexPosition);
    float diffuseLightIntensity = max(0, dot(surfaceNormal, lightDirection));
    gl_FragColor.rgb = diffuseLightIntensity * varyingColor.rgb;
    gl_FragColor += gl_LightModel.ambient;
    vec3 reflectionDirection = normalize(reflect(lightDirection, surfaceNormal));
    vec3 eyeVecNormal = normalize(varyingEyeVec);
    float specular = max(0.0, dot(eyeVecNormal, reflectionDirection));
    if (diffuseLightIntensity != 0) {
        float fspecular = pow(specular, gl_FrontMaterial.shininess)*gl_LightSource[0].specular.rgb;
        gl_FragColor += fspecular;
    }
    gl_FragColor = texture2D(my_color_texture, varyingTexCoord)*gl_FragColor;
}
Run Code Online (Sandbox Code Playgroud)

dat*_*olf 5

您不应使用内置的遗留 OpenGL 变量。它们已被弃用,并使您的着色器与更高版本的 OpenGL 不兼容。

\n\n

当您使用着色器时,您就使用着色器。着色器的全部意义在于摆脱固定的函数状态及其 API。OpenGL-3核心删除了所有固定功能管道API,包括glMaterial\xe2\x80\xa6.

\n\n

相反,您需要自己定义所有制服。此外,您的代码看起来像是顶点着色器和片段着色器的混合体。所有矩阵变换的内容都属于顶点着色器。在片段着色器中执行此操作会浪费宝贵的计算周期。

\n

  • @visDEVion:我建议您完成有关现代 OpenGL 的教程。Nicol Bolas 非常出色,您可以在 http://arcsynthesis.org/gltut 找到它 – 它还深入解释了如何以现代、面向未来的方式使用着色器。 (4认同)