在固定管道中,使用材质时gl_color设置的颜色会发生什么?
有没有办法在glsl片段着色器中检索gl_color设置的颜色?
答案 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_FrontMaterial
,gl_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_SMOOTH
或GL_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);