为什么“gl_Position”与“position”是不同的数据类型

问题描述 投票:0回答:2

我正在从代码示例中学习 GLSL 着色器,我对以下事情感到困惑:gl_Position 是 vec4 数据类型,position 是 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>
opengl-es webgl
2个回答
22
投票

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 快速参考卡 上有它们的列表。 所有其他变量均由程序员设定

内置输入、输出和常数 [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 精度,并且状态被列为 highp,那么该状态在片段中只能作为中级可用 语言。

struct gl_DepthRangeParameters {
   highp float near; // n
   highp float far; // f
   highp float diff; // f - n
};

uniform gl_DepthRangeParameters gl_DepthRange;

var as

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,因此没有理由手动执行此操作。

您可能会发现这些文章有助于解释 WebGL


13
投票

gl_Position
是一个内置的顶点着色器输出变量,其类型由OpenGL规范定义为
vec4

position
是顶点着色器属性,自从引入可编程着色器以来,you(作为开发人员)可以完全控制其格式。

最有可能的是,您有每个顶点的 3D 坐标(因此,每个顶点只有 3 个浮点),您通过调用

glVertexAttribPointer
(或类似的)将其配置为顶点着色器输入,告诉 OpenGL 一次拉 3 个浮点来自
position
属性的缓冲区。由于
gl_Position
需要 4 个浮点数,因此在顶点着色器中需要扩展到
vec4
(通过将
w
填充为 1.0)。

© www.soinside.com 2019 - 2024. All rights reserved.