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