Проблема с наложением текстуры в OpenGL 4. Рисуется простой прямоугольник. Хочу наложить на него простейшую 2x2 текстуру (первый тексель-красный цвет, второй - зеленый, третий - синий, четевертый - желтый). То есть по логике в мой прямоугольник должны вписаться 4 разноцветных прямоугольника (красный, зеленый, синий, желтый). В итоге на выходе получаю прямоугольник, залитый одним цветом (темно-желтым). Причем этот итоговый цвет судя по всему является смешением цветов текселей (пробовал менять тексели 2x2 текстуры). То есть вместо того, чтобы накладывать на пиксели прямоугольника пиксели текстуры(тексели), OpenGL смешивает все тексели текстуры, получает 1 итоговый цвет и полностью им заливает прямоугольник. Как так? P.S. API еще только изучаю по OpenGL Red book 8th edition.
Вот фрагмент исходников:
static GLuint TexCoordAttribLoc=glGetAttribLocation(SHAP,"inTextura_coord");
static GLuint TextureId;
static GLuint SamplerId;
static const GLfloat TexCoord[]=
{
0.0f,0.0f, 1.0f,0.0f,
1.0f,1.0f, 0.0f,1.0f
};
static const GLfloat Texels[16]=
{
1.0f,0.0f,0.0f,1.0f, 0.0f,1.0f,0.0f,1.0f,
0.0f,0.0f,1.0f,1.0f, 1.0f,1.0f,0.0f,1.0f
};
glActiveTexture(GL_TEXTURE0);
glGenTextures(1,&TextureId);
glGenSamplers(1,&SamplerId);
glBindSampler(0, SamplerId);
glBindTexture(GL_TEXTURE_2D, TextureId);
glTexStorage2D(GL_TEXTURE_2D,1,GL_RGBA32F, 2,2);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,2,2,GL_RGBA,GL_FLOAT,Texels);
glVertexAttribPointer(TexCoordAttribLoc,2,GL_FLOAT,GL_FALSE,0,TexCoord);
glEnableVertexAttribArray(TexCoordAttribLoc);
Код вершинного шейдера
#version 430 core
layout (location = 0) in vec4 vPosition;
layout(location=1) uniform mat4 CurrentMdMatrix=mat4(1.0f);
layout(location=5) uniform mat4 CurrentPrMatrix=mat4(1.0f);
layout(location=9) in vec4 vColor;
layout(location=15) in vec2 inTextura_coord;
out vec2 textura_coord;
out vec4 FragmentColor;
void main()
{
textura_coord=inTextura_coord;
FragmentColor=vColor;
gl_Position=CurrentPrMatrix*CurrentMdMatrix*vPosition;
}
на переменные vColor и FragmentColor не обращайте внимание,я просто их не стал удалять с предыдущей версии шейдера.
Фрагментный (пиксельный) шейдер:
#version 430 core
uniform sampler2D textura;
in vec2 textura_coord;
in vec4 FragmentColor;
out vec4 fColor;
void main()
{
gl_FragColor=texture(textura,textura_coord);
}