【发布时间】:2018-01-22 20:04:00
【问题描述】:
在固定管线中,使用材质时gl_color设置的颜色会怎样?
有没有办法在 glsl 片段着色器中检索 gl_color 设置的颜色?
【问题讨论】:
-
你知道旧的固定管道使用哪种着色器模型(Gouraud,Phong...),当只设置颜色时?
-
启用
GL_COLOR_MATERIAL时,材质由glColor调制
在固定管线中,使用材质时gl_color设置的颜色会怎样?
有没有办法在 glsl 片段着色器中检索 gl_color 设置的颜色?
【问题讨论】:
GL_COLOR_MATERIAL 时,材质由 glColor 调制
见OpenGL 2.1 API Specification - 2.15.3 Shader Variables, page 76
顶点属性
顶点着色器可以访问内置的顶点属性变量,这些变量对应于由Vertex、Normal、Color等命令设置的每个顶点状态>。 .....
见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...),而只设置颜色?
Phong 着色在 OpenGL 固定功能管道中是不可能的。见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 指定材质参数跟踪当前颜色。
例如
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
【讨论】: