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 规范明确定义了 floats 和 ints 的精度要求,例如使任何 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 都可以。