如何设置opengl shininess float,以便我可以在gl_FrontMaterial.shininess
的着色器程序中使用它?
我尝试了这个glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100f);
,但亮点没有变小,所以我想shinines没有变化。
修改 这是我使用它的片段着色器程序:
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;
}
答案 0 :(得分:4)
您不应该使用内置的旧版OpenGL变量。它们已被弃用,使您的着色器与更高版本的OpenGL不兼容。
使用着色器时,使用着色器。着色器的重点是摆脱固定的功能状态及其API。 OpenGL-3核心删除了所有固定功能管道API,包括glMaterial…
。
而是定义您自己需要的所有制服。此外,您的代码看起来像顶点着色器和片段着色器的混合。所有矩阵变换都属于顶点着色器。在片段着色器中执行此操作会浪费宝贵的计算周期。