首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“gl_Position”是一种不同于“位置”的数据类型

为什么“gl_Position”是一种不同于“位置”的数据类型
EN

Stack Overflow用户
提问于 2015-06-29 20:54:24
回答 2查看 17.1K关注 0票数 5

我正在从代码示例中了解GLSL着色器,我对以下内容感到困惑: gl_Position是vec4数据类型,位置是vec3数据类型,为什么?这个“职位”变量到底是什么?在哪里可以找到相关的文档?我所能找到的只有gl_Position引用,gl_projectionMatrix和projectionMatrix的引用也是一样。即使在GLSL备忘单中也没有定义projectionMatrix。

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-30 16:21:29

position是一个名为变量的用户。position对WebGL没有任何意义。它很可能被称为foobarwhatever。它对WebGL没有任何意义,就像变量xyz在JavaScript中没有意义一样。

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

代码语言:javascript
复制
attribute vec3 xyz;       // this has no meaning to WebGL
attribute vec3 position;  // this has no meaning to WebGL either

projectionMatrix也是如此。这是一个由程序员创建的变量。WebGL不在乎名字是什么。如果您使用的是某个库(比如three.js),它可能会为变量提供一些名称,但这些变量和所选的名称是库的一部分,而不是WebGL的一部分。日本程序员可能会使用haichishaeigyouretu之类的名字,而不是positionprojectionMatrix

gl_开头的变量是特殊的全局变量。WebGL Quick Reference Card上有一张他们的名单。所有其他变量都由程序员组成。

内置输入、输出和常量7 着色程序使用特殊变量与管道的固定功能部分通信.输出特殊变量可以在写入后读取。输入特殊变量是只读的.所有特殊变量都具有全局范围。 顶点着色特殊变量7.1 输出:可变维描述,单位或坐标系,---------------------------+----------------------+------------------,vec4,gl_Position;变换后的顶点,夹子坐标,位置,位置,---------------------------+----------------------+------------------,中间浮点,gl_PointSize;转换后的点大小为x(点栅格化(仅限于点栅格)\ ---------------------------+----------------------+------------------ ) 片段着色特殊变量7.2 片段着色器可以写入gl_FragColorgl_FragData[]的一个或多个元素,但不能同时写入。gl_FragData数组的大小由内置常数gl_MaxDrawBuffers给出. 输入:变量\ ---------------------------+----------------------+------------------中间vec4 gl_FragCoord;片段位置:窗口坐标在帧缓冲区中,---------------------------+----------------------+------------------,bool,gl_FrontFacing;_~_( vec2 Gl_PointCoord);片段位置从0到1.0在一个点内(点为每一个组件只进行网格化)---------------------------+----------------------+-产出:可变维描述单位或坐标系统---------------------------+----------------------+------------------ mediump vec4 gl_FragColor;片段色RGBA色---------------------------+----------------------+------------------中间色vec4 gl_FragDatan|fragment色,用于摄制RGBA颜色x颜色附件n?-------------+----------------------+ 内置常数,最小值为7.4 内建的常量最小值--------------------------------------------------+------------------ const mediump int gl_MaxVertexAttribs 8------------------------------------+------------------ const int gl_MaxVertexUniformVectors 128 --------------------------------------------------+----------------------------------+------------------ const中介int gl_MaxCombinedTextureImageUnits _8--------------------------------------------------+------------------------------+------------------ const中介int gl_MaxDrawBuffers \1--------------------------------------------------+ 内置统一国家7.5 指定窗口坐标中的深度范围。如果一个实现不支持片段语言中的highp精度,并且状态被列为highp,那么该状态在片段语言中将仅作为中介可用。 结构gl_DepthRangeParameters {高漂近;// n高漂远;// f高浮差;// f-n };均匀gl_DepthRangeParameters gl_DepthRange;

作为position,作为一个vec3,这也是程序员的决定。做一个vec4或者float或者任何你想要的一样好。

虽然着色器可以是您想要的任何东西,并且使用您想要的任何变量名称,但是最常见的顶点着色器是

代码语言:javascript
复制
attribute vec4 position;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;

void main() {
  gl_Position = projectionMatrix * modelViewMatrix * position;
}

有些程序员将vec3用于position,但无论如何,他们不得不强迫它进入vec4。

代码语言:javascript
复制
attribute vec3 position;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;

void main() {
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1);
}

而且,由于一个w属性的vec4值默认为1.0,所以没有理由手动执行它。

You might find these articles helpful in explaining WebGL

票数 18
EN

Stack Overflow用户

发布于 2015-06-29 20:59:53

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

position是一个顶点着色器属性,由于可编程着色器的引入,you (作为开发人员)完全控制了它的格式。

最有可能的是,您有每个顶点的3D坐标(因此,每个顶点只有3个浮点数),通过调用glVertexAttribPointer (或类似的)将其配置为顶点着色器输入,告诉OpenGL每次从position属性的缓冲区中提取3个浮点数。因为gl_Position想要4个浮动,所以在顶点着色器中需要扩展到vec4 (通过将w填充到1.0)。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31125387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档