微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

opengl – GLSL – 使用自定义输出属性而不是gl_Position

我目前正在使用着色器学习OpenGL(3.3).有一件事我似乎无法解决.我已经读过在OpenGL 3中不推荐使用内置变量如gl_Position和gl_FragCoords,因此我想使用自己的输出变量.

所以不是这样的:

#version 330\n
layout(location=0) in vec2 i_position;
out vec4 o_position;
void main() 
{
    gl_Position = vec4(i_position,0.0,1.0);
};

我写了这个:

#version 330\n
layout(location=0) in vec2 i_position;
out vec4 o_position;
void main() 
{
    o_position = vec4(i_position,1.0);
};

着色器在两种情况下编译都没有问题,但第二个代码生成空白屏幕.我是否需要以某种方式指定哪个变量是输出变量?

解决方法

这主要是由评论所涵盖,但为了得到答案,让我总结一下核心概况中哪些预定义的GLSL变量已经消失,哪些仍然存在.

在大多数情况下,预定义变量从核心配置文件着色器中删除,这是固定功能管道的大部分从API中移除的直接结果.有很多统一变量反映了根本不再存在的状态.典型的例子包括

>修复了函数转换状态(gl_ModelViewMatrix,gl_ProjectionMatrix等).
>照明参数(gl_Light *).
>材料参数(gl_Material *).
>剪辑平面(gl_Clip *).

类似地,接收固定函数顶点属性的顶点着色器输入已消失,因为核心配置文件中仅支持通用属性.这些包括gl_Vertex,gl_normal,gl_Color等.

还有一些预先定义的变量变量,如gl_FrontColor,gl_BackColor和gl_TexCoord都已消失,可以通过定义自己的out / in变量轻松替换.

同样消失的是预定义的片段着色器输出gl_FragColor和gl_FragData.这是一个有趣的案例,因为原因不是功能弃用.我的理解是它们被弃用了,因为它们不够灵活,无法容纳当前的功能.由于gl_FragColor的类型是vec4,因此片段着色器的输出必须是具有float组件的向量.如果您的渲染目标具有不同的类型,例如,这不会很好.如果要渲染整数纹理.

那么还有什么预先定义的变量呢?虽然比以前少得多,但仍有一些,这些都与可编程管道中仍然存在的固定功能有关.例子包括

>顶点着色器和片段着色器之间的顶点坐标界面,主要由顶点着色器中的gl_Position输出和片段着色器中的gl_FragCoord输入组成.在顶点和片段着色器之间仍然存在许多固定的功能块,如剪切和光栅化.那些固定的功能块在顶点坐标上运行,因此预定义的变量仍然有意义.
>一些与实例化相关的变量(gl_VertexID,gl_InstanceID).
> gl_Clipdistance支持使用任意平面进行裁剪,它也以固定函数形式存在.
> gl_FrontFacing.三角形的绕线顺序由固定功能评估,并可用于片段着色器.

这些列表都没有详尽无遗,但我希望这是一个有用的概述,并提供一些背景知识.与往常一样,规范文档提供了最终和完整的答案.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。