我正在从代码示例中了解GLSL着色器,我对以下内容感到困惑: gl_Position 是vec4数据类型而位置是vec3数据类型,为什么?这个“位置”变量到底是什么?我在哪里可以找到某种文档?我能找到的是gl_Position参考,gl_projectionMatrix和projectionMatrix也是如此。即使在GLSL备忘单中也未定义 projectionMatrix 。
<script type="x-shader/x-vertex" id="vertexshader">
varying vec3 col;
void main()
{
col = vec3( uv, 1.0 );
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
</script>
<script type="x-shader/x-fragment" id="fragmentshader">
varying vec3 col;
void main()
{
gl_FragColor = vec4(col, 1);
}
</script>
答案 0 :(得分:15)
position
是一个名为变量的用户。 position
对WebGL没有意义。它可能被称为foo
或bar
或whatever
。对于WebGL没有任何意义,就像变量xyz
在JavaScript中没有意义一样
的JavaScript
var xyz = 123; // this has no meaning to JavaScript, only to the programmer
var position = 789; // this has no meaning to JavaScript either.
WebGL GLSL
attribute vec3 xyz; // this has no meaning to WebGL
attribute vec3 position; // this has no meaning to WebGL either
projectionMatrix
也是如此。它是程序员制作的变量。 WebGL并不关心名称是什么。如果您正在使用某些库(例如说three.js),这些库可能构成变量的某些名称,但这些变量和所选的名称是库的一部分,而不是WebGL的一部分。日语程序员可能会使用haichi
和shaeigyouretu
等名称,而不是position
和projectionMatrix
。
以gl_
开头的变量是特殊的全局变量。 WebGL Quick Reference Card上有一个列表。 所有其他变量由程序员组成。
内置输入,输出和常量[7]
着色器程序使用特殊变量与管道的固定功能部分进行通信。写入后可以回读输出特殊变量。输入特殊变量是只读的。所有特殊变量都具有全球范围。
顶点着色器特殊变量[7.1]
Outputs: Variable |Description | Units or coordinate system ---------------------------+----------------------+------------------ highp vec4 gl_Position; |transformed vertex |clip coordinates |position | ---------------------------+----------------------+------------------ mediump float gl_PointSize;|transformed point size|pixels |(point rasterization | |only) | ---------------------------+----------------------+------------------
片段着色器特殊变量[7.2]
片段着色器可以写入
gl_FragColor
或gl_FragData[]
的一个或多个元素,但不能同时写入两者。gl_FragData
数组的大小由内置常量gl_MaxDrawBuffers
给出。Inputs: Variable |Description | Units or coordinate system ---------------------------+----------------------+------------------ mediump vec4 gl_FragCoord; |fragment position | window coordinates | within frame buffer | ---------------------------+----------------------+------------------ bool gl_FrontFacing; |fragment belongs to a | Boolean |front-facing primitive| ---------------------------+----------------------+------------------ mediump vec2 gl_PointCoord;|fragment position | 0.0 to 1.0 for |within a point (point | each component |rasterization only) | ---------------------------+----------------------+------------------ Outputs: Variable |Description | Units or coordinate system ---------------------------+----------------------+------------------ mediump vec4 gl_FragColor; |fragment color | RGBA color ---------------------------+----------------------+------------------ mediump vec4 gl_FragData[n]|fragment color for | RGBA color |color attachment n | ---------------------------+----------------------+------------------
具有最小值的内置常量[7.4]
Built-in Constant | Minimum value --------------------------------------------------+------------------ const mediump int gl_MaxVertexAttribs | 8 --------------------------------------------------+------------------ const mediump int gl_MaxVertexUniformVectors | 128 --------------------------------------------------+------------------ const mediump int gl_MaxVaryingVectors 8 | --------------------------------------------------+------------------ const mediump int gl_MaxVertexTextureImageUnits | 0 --------------------------------------------------+------------------ const mediump int gl_MaxCombinedTextureImageUnits | 8 --------------------------------------------------+------------------ const mediump int gl_MaxTextureImageUnits | 8 --------------------------------------------------+------------------ const mediump int gl_MaxFragmentUniformVectors | 16 --------------------------------------------------+------------------ const mediump int gl_MaxDrawBuffers | 1 --------------------------------------------------+------------------
内置统一状态[7.5]
指定窗口坐标中的深度范围。如果实现了 不支持片段语言中的highp精度,并且state列为highp,那么该状态只能作为片段中的mediump使用 语言。
struct gl_DepthRangeParameters { highp float near; // n highp float far; // f highp float diff; // f - n }; uniform gl_DepthRangeParameters gl_DepthRange;
var position
是一个vec3,也是程序员的决定。它是vec4
或float
或任何您想要的一样好。
虽然着色器可以是你想要的任何东西并使用你想要的任何变量名称,但最常见的顶点着色器可能是
。attribute vec4 position;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * position;
}
有些程序员使用vec3
作为position
但是他们必须将其强制转换为vec4
attribute vec3 position;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1);
}
由于vec4属性的w
值默认为1.0,因此没有理由手动执行此操作。
答案 1 :(得分:9)
gl_Position
是一个内置的顶点着色器输出变量,其类型由OpenGL规范定义为vec4
。
position
是顶点着色器属性,自引入可编程着色器后,你(作为开发人员)完全控制其格式。
最有可能的是,你有每个顶点的三维坐标(因此,每个顶点只有3个浮点数),你通过调用glVertexAttribPointer
(或类似的)来配置为顶点着色器输入,告诉OpenGL拉3从position
属性的缓冲区一次浮动。由于gl_Position
需要4个浮点数,因此在顶点着色器中需要扩展到vec4
(通过将w
填入1.0)。