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
我正在使用 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 的工作方法?
谢谢 :).
所以我意识到我可以在着色器中有一个制服来保存屏幕的 y 边界并在 glsl 中获得适当的 y 坐标我只是 (1/screenYBounds)*vert.x 。我仍然想回答有关将 ints/unsigned 个字符传输到着色器的其他问题。谢谢 :).
GLES 2.0 中没有整数属性,无法使用浮点属性。事实上,硬件 GLES2 目标甚至可能根本不支持着色器核心中的整数,并且无论何时使用 int
,实现都可能只是在幕后使用浮点类型 - 这种嵌入式并不罕见GPU 根本没有专用的整数 ALU。
GLSL ES 规范明确定义了 float
s 和 int
s 的精度要求,例如使任何 int
exactly 可表示通过可用的浮点类型。 GLSL_ES Shading Language Specification, Version 1.0(GLES2 的着色语言)第 4.5.1 节指出:
For high and medium precisions, integer ranges must be such that they can be accurately represented by
the corresponding floating point value of the same precision qualifier. That is, a highp int
can be
represented by a highp float
, a mediump int
can be represented by a mediump float
. However, lowp int
cannot be represented by a lowp float
;
lowp int
不能用 lowp float
表示并不重要,因为它总是可以用 mediump float
表示。这里的关键点是即使 highp int
也总是可以用可用的浮点类型表示,这意味着任何 int
都可以。
我正在使用 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 的工作方法?
谢谢 :).
所以我意识到我可以在着色器中有一个制服来保存屏幕的 y 边界并在 glsl 中获得适当的 y 坐标我只是 (1/screenYBounds)*vert.x 。我仍然想回答有关将 ints/unsigned 个字符传输到着色器的其他问题。谢谢 :).
GLES 2.0 中没有整数属性,无法使用浮点属性。事实上,硬件 GLES2 目标甚至可能根本不支持着色器核心中的整数,并且无论何时使用 int
,实现都可能只是在幕后使用浮点类型 - 这种嵌入式并不罕见GPU 根本没有专用的整数 ALU。
GLSL ES 规范明确定义了 float
s 和 int
s 的精度要求,例如使任何 int
exactly 可表示通过可用的浮点类型。 GLSL_ES Shading Language Specification, Version 1.0(GLES2 的着色语言)第 4.5.1 节指出:
For high and medium precisions, integer ranges must be such that they can be accurately represented by the corresponding floating point value of the same precision qualifier. That is, a
highp int
can be represented by ahighp float
, amediump int
can be represented by amediump float
. However,lowp int
cannot be represented by alowp float
;
lowp int
不能用 lowp float
表示并不重要,因为它总是可以用 mediump float
表示。这里的关键点是即使 highp int
也总是可以用可用的浮点类型表示,这意味着任何 int
都可以。