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 规范明确定义了floats 和ints 的精度要求,以便使任何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 中创建像光一样的渐变

OpenGL/GLSL 颜色附件范围

OpenGL、GLSL 片段着色器无法读取 Sampler2D 纹理

OpenGL第1章-入门

Qt 4.6 OpenGL GLSL

使用着色器和 VBO 绘制四边形