Я пытаюсь повернуть текстуру внутри вершинного шейдера. У меня есть указатель на текстуру, которая для моей цели повернута против часовой стрелки на 90 градусов. Я не хочу вручную поворачивать текстуру перед вызовом glTexImage2D()
.
Я могу использовать только #version 120
.
Это мой оригинальный вершинный шейдер:
#version 120
attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
gl_Position = a_position;
v_texCoord = a_texCoord;
}
Только для целей тестирования я изменил вершинный шейдер таким образом, но получил черный экран:
#version 120
const float w = 0.76;
float mat3 A = ( 1, 0, 0,
0, 1, 0,
0, 0, 1 );
attribute vec3 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
A = ( cos(w), -sin(w), 0,
sin(w), cos(w), 0,
0, 0, 1 );
gl_Position = A * vec4(a_position, 1.0f);
v_texCoord = a_texCoord;
}
Вы можете создать матрицу текстуры и умножить ее на координаты текстуры в вершинном шейдере.
Вы получаете ошибки компиляции. Задание не работает:
A = (cos(w), -sin(w), 0, sin(w), cos(w), 0, 0, 0, 1 );
Вы должны построить mat3
. Затем вы можете назначить эту матрицу (также см. Программирование GLSL/Векторные и матричные операции):
A = mat3(cos(w), -sin(w), 0.0,
sin(w), cos(w), 0.0,
0.0, 0.0, 1.0);
Нельзя умножать vec4
и mat3
. Вы должны умножить vec3
на mat3
gl_Position = vec4(A * a_position, 1.0f);
И я даже не могу представить, что вы ожидаете от этой строки:
float mat3 A = ( 1, 0, 0, 0, 1, 0, 0, 0, 1 );
Правильно будет:
mat3 A = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
Это то же самое, что:
mat3 A = mat3(1.0);
Правильный вершинный шейдер:
#version 120
attribute vec3 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
const float w = 0.76;
mat3 A = mat3(cos(w), -sin(w), 0.0,
sin(w), cos(w), 0.0,
0.0, 0.0, 1.0);
gl_Position = vec4(A * a_position, 1.0);
v_texCoord = a_texCoord;
}
@Rabbid76 отсутствует очень глупая ошибка mat3
в определении матрицы. Кроме того, у меня очень длинный журнал, и я не видел ошибки компиляции, она была! :D P.S.: строка gl_Position = vec4(A * a_position, 1.0);
была верной, напечатал mistamtch. Спасибо за быстрый ответ
Я не уверен, компилируется ли этот код в версии 120, но общая идея заключается в создании матрицы текстуры.
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoord;
uniform mat4 textureMatrix;
out vec2 TexCoord;
void main()
{
vec4 mTex;
mTex = textureMatrix * vec4( aTexCoord.x , aTexCoord.y , 0.0 , 1.0 );
TexCoord = vec2(mTex.x , mTex.y );
}
A * vec4(a_position, 1.0f); вы умножаете матрицу 3 X 3 на vec 4.