我正在从代码示例中了解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>发布于 2015-06-30 16:21:29
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 eitherprojectionMatrix也是如此。这是一个由程序员创建的变量。WebGL不在乎名字是什么。如果您使用的是某个库(比如three.js),它可能会为变量提供一些名称,但这些变量和所选的名称是库的一部分,而不是WebGL的一部分。日本程序员可能会使用haichi和shaeigyouretu之类的名字,而不是position和projectionMatrix。
以gl_开头的变量是特殊的全局变量。WebGL Quick Reference Card上有一张他们的名单。所有其他变量都由程序员组成。
内置输入、输出和常量7 着色程序使用特殊变量与管道的固定功能部分通信.输出特殊变量可以在写入后读取。输入特殊变量是只读的.所有特殊变量都具有全局范围。 顶点着色特殊变量7.1 输出:可变维描述,单位或坐标系,---------------------------+----------------------+------------------,vec4,gl_Position;变换后的顶点,夹子坐标,位置,位置,---------------------------+----------------------+------------------,中间浮点,gl_PointSize;转换后的点大小为x(点栅格化(仅限于点栅格)\ ---------------------------+----------------------+------------------ ) 片段着色特殊变量7.2 片段着色器可以写入
gl_FragColor或gl_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或者任何你想要的一样好。
虽然着色器可以是您想要的任何东西,并且使用您想要的任何变量名称,但是最常见的顶点着色器是
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);
}而且,由于一个w属性的vec4值默认为1.0,所以没有理由手动执行它。
发布于 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)。
https://stackoverflow.com/questions/31125387
复制相似问题