gl_color和材料之间的相互依赖性

时间:2018-01-22 20:04:00

标签: opengl glsl light

  1. 在固定管道中,使用材质时gl_color设置的颜色会发生什么?

  2. 有没有办法在glsl片段着色器中检索gl_color设置的颜色?

1 个答案:

答案 0 :(得分:2)

请参阅OpenGL 2.1 API Specification - 2.15.3 Shader Variables, page 76

  

顶点属性

     

顶点着色器可以访问与顶点正常颜色。 .....

请参阅OpenGL Shading Language 1.20 Specification - 7.3 Vertex Shader Built-In Attributes, page 49

  

以下属性名称内置于OpenGL顶点语言中,可以在顶点着色器中使用,以访问OpenGL声明的属性的当前值。

attribute vec4 gl_Color;

这意味着,glColor*设置的颜色可以通过顶点着色器中的属性attribute vec4 gl_Color;访问。


参见[OpenGL着色语言1.20规范 - 7.5内置统一状态,第50页]:

  

作为访问OpenGL处理​​状态的辅助工具,OpenGL着色语言中内置了以下统一变量。

     

.....

struct gl_MaterialParameters {
    vec4 emission; // Ecm
    vec4 ambient; // Acm
    vec4 diffuse; // Dcm
    vec4 specular; // Scm
    float shininess; // Srm
};
uniform gl_MaterialParameters gl_FrontMaterial;
uniform gl_MaterialParameters gl_BackMaterial;

这意味着,glMaterial设置的材质属性可以通过内置的统一变量gl_FrontMaterialgl_BackMaterial访问。


另请参阅OpenGL Shading Language (GLSL) Quick Reference Guide

参考评论中的其他问题:

  

当你只设置一种颜色时,你知道旧的固定管道使用哪种着色器模型(Gouraud,Phong ......)吗?

在OpenGL固定功能管道中不可能使用Phong着色。见Legacy opengl - Why is phong shading not possible?

除非您在自己的着色器中实现phong着色。见Per Fragment Lighting

通常,着色模型可以由glShadeModel设置,可以是GL_SMOOTHGL_FLAT

进一步说明:

如果启用了光照(glEnable(GL_LIGHTING)),那么您必须按glMaterial设置颜色(gl_Color)。

但如果另外GL_COLOR_MATERIAL已启用(glEnable(GL_COLOR_MATERIAL)),则您可以指定材质参数跟踪当前颜色glColorMaterial

e.g。

glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);

请参阅How lighting works