【问题标题】:Inter dependency between gl_color and materialgl_color 和材质之间的相互依赖关系
【发布时间】:2018-01-22 20:04:00
【问题描述】:
  1. 在固定管线中,使用材质时gl_color设置的颜色会怎样?

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

【问题讨论】:

  • 你知道旧的固定管道使用哪种着色器模型(Gouraud,Phong...),当只设置颜色时?
  • 启用 GL_COLOR_MATERIAL 时,材质由 glColor 调制

标签: opengl glsl light


【解决方案1】:

OpenGL 2.1 API Specification - 2.15.3 Shader Variables, page 76

顶点属性

顶点着色器可以访问内置的顶点属性变量,这些变量对应于由VertexNormalColor等命令设置的每个顶点状态>。 .....

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...),而只设置颜色?

Phong 着色在 OpenGL 固定功能管道中是不可能的。见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 指定材质参数跟踪当前颜色。

例如

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

How lighting works

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2015-05-07
    • 2013-08-04
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多