Opengl/glsl 试图为绘制四边形编写着色器,但不确定如何处理屏幕纵横比的变化
Posted
技术标签:
【中文标题】Opengl/glsl 试图为绘制四边形编写着色器,但不确定如何处理屏幕纵横比的变化【英文标题】:Opengl/glsl trying to write a shader for drawing quads but not sure how to handle changes in aspect ratio of the screen 【发布时间】:2016-03-20 18:45:43 【问题描述】:我正在使用 opengl es 2,我正在尝试创建一个经过优化的着色器以渲染带纹理的四边形。
垂直着色器:
attribute float vertIndex;
uniform vec4 verts[4] = vec4[](vec4(-1,-1,0,1), vec4(-1,1,0,1), vec4(1,1,0,1), vec4(1,-1,0,1));
uniform vec2 texCoords[4] = vec2[](vec2(0,0), vec2(0,1), vec2(1,1), vec2(1,0));
uniform vec2 size(0,0); //size of the quad about to be rendered
uniform vec2 translation(0,0); //position of the quad about to be rendered
varying vec2 TexCoordOut;
void main()
vec2 vert = verts[int(vertIndex)];
vert.x *= size.x;
vert.y *= size.y;
vert.x += translation.x;
vert.y += translation.y;
gl_Position = vert;
TexCoordOut = texCoords[int(vertIndex)];
在我的程序中,我设置了屏幕边界,因此 x 始终为 -1,1,y 将根据屏幕的纵横比进行调整。问题是 glsl 中的屏幕边界始终是 -1,1,1,-1 。我该如何处理?此外,我使用浮点数而不是无符号字符作为索引,因为当我尝试将整数传输到垂直着色器时,它无法正常工作。 opengl es 2有没有可行的方法来做到这一点?
谢谢:)。
【问题讨论】:
【参考方案1】:GLES 2.0 中没有整数属性,无法绕过使用浮点属性。事实上,硬件 GLES2 目标甚至可能根本不支持着色器内核中的整数,并且每当您使用 int
时,实现可能只是在底层使用浮点类型 - 这种嵌入式 GPU 的情况并不少见根本没有专用的整数 ALU。
GLSL ES 规范明确定义了float
s 和int
s 的精度要求,以便使任何int
精确 都可以用可用的浮点类型表示。 GLSL_ES Shading Language Specification, Version 1.0(这是 GLES2 的着色语言)的第 4.5.1 节指出:
对于高精度和中等精度,整数范围必须能够准确地表示为 相同精度限定符的对应浮点值。也就是说,
highp int
可以是 用highp float
表示,mediump int
可以用mediump float
表示。但是,lowp int
不能用lowp float
表示;
lowp int
不能用lowp float
表示并不重要,因为它也总是可以用mediump float
表示。这里的关键点是,即使highp int
也始终可以用可用的浮点类型表示,这意味着任何int
都可以。
【讨论】:
谢谢:)。它说我需要 15 个声望点才能 +1,所以我不能这样做。对不起。【参考方案2】:所以我意识到我可以在着色器中有一个统一的东西来保存屏幕的 y 边界,并在 glsl 中获得适当的 y 坐标,我只需 (1/screenYBounds)*vert.x 。我仍然想回答有关将整数/无符号字符传输到着色器的另一个问题。谢谢:)。
【讨论】:
以上是关于Opengl/glsl 试图为绘制四边形编写着色器,但不确定如何处理屏幕纵横比的变化的主要内容,如果未能解决你的问题,请参考以下文章
片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变