Opengl / glsl пытается написать шейдер для рисования четырехугольников, но не знает, как обрабатывать изменения в соотношении сторон экрана

Я использую 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. Как мне справиться с этим? Кроме того, я использую float вместо беззнаковых символов для индексов, потому что, когда я пытался передать ints в vert shader, он не работал должным образом. Есть ли рабочий способ сделать это с OpenGLES ES 2?

Спасибо :).

0

Решение

В GLES 2.0 просто нет целочисленных атрибутов, нет никакого способа использовать атрибуты с плавающей точкой. Фактически, аппаратные цели GLES2 могут вообще не иметь поддержки целочисленных значений в ядрах шейдеров, и реализация может просто использовать типы с плавающей запятой внутри всякий раз, когда вы используете int — для таких встроенных графических процессоров было бы весьма необычным вообще не иметь выделенных целочисленных ALU.

Спецификация GLSL ES четко определяет требования к точности для floatс и intс тем, чтобы сделать любой int именно так представляются доступным типом с плавающей точкой. Раздел 4.5.1 GLSL_ES Спецификация языка затенения, версия 1.0 (это язык затенения для GLES2) гласит:

Для высокой и средней точности целочисленные диапазоны должны быть такими, чтобы они могли быть точно представлены
соответствующее значение с плавающей точкой того же квалификатора точности. Это highp int может быть
представлен highp float, mediump int может быть представлен mediump float, Тем не мение, lowp int
не может быть представлен lowp float;

Это не важно lowp int не может быть представлен lowp float, как это всегда может быть представлено mediump float также. Критическим моментом здесь является то, что даже highp int всегда может быть представлен доступным типом с плавающей точкой, что означает любой int Можно.

1

Другие решения

Таким образом, я понял, что у меня может быть униформа в шейдере, которая содержит y-границы экрана, и чтобы получить соответствующую y-координату в glsl I just (1 / screenYBounds) * vert.x. Я все еще хотел бы, чтобы другой вопрос о передаче целых / беззнаковых символов в шейдер ответил. Спасибо :).

0

По вопросам рекламы [email protected]