Отображение текстур GLSL

Я хочу сделать наложение текстуры с помощью GLSL. Но я думаю, что в моем коде шейдеры не используются. Вот мои коды:

Vertex.vert

#version 330


out vec2 texcoord;

void main()
{
    gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;
    texcoord=gl_MultiTexCoord0.xy;
}

Fragment.frag

#version 330

uniform sampler2D img;
in vec2 texcoord;

void main()
{
    vec4 texcolor = texture2D(img,texcoord);
    gl_FragColor=texcolor;

}

Часть наложения текстуры в основном

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, _textureId[0]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);      
    glUniform1i(glGetUniformLocation(shader.ShaderProgram,"img"),0);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(-2.5f, -2.5f, 2.5f);
    glTexCoord2f(1.0f, 0.0f);
    glVertex3f(2.5f, -2.5f, 2.5f);
    glTexCoord2f(1.0f, 1.0f);
    glVertex3f(2.5f, -2.5f, -2.5f);
    glTexCoord2f(0.0f, 1.0f);
    glVertex3f(-2.5f, -2.5f, -2.5f);
    glEnd();

Что не так с моим кодом? Полные коды:

http://codepad.org/O096OoKU

http://codepad.org/m3Snroyv

http://codepad.org/8zvJ4Vrp


person peaceman    schedule 24.02.2013    source источник


Ответы (2)


Мне кажется, что с шейдерным кодом все в порядке. однако вы никогда не вызывали glGetAttribLocation () glGetUniformLocation ()

перед вызовом gluniform (), glVertexAttribPointer ()

также вы должны вызвать glUseProgram () один раз незадолго до того, как все они вызовут.

person Sung    schedule 24.02.2013
comment
Если вы посмотрите на первую ссылку, я вызову shader.CompileShaders (); перед mainloop. glUseProgram () в этом. Но как я могу использовать упомянутые вами функции? Если это просто, можете ли вы это написать? - person peaceman; 25.02.2013
comment
Этот glUsePrograme () должен вызываться перед каждым вызовом glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, m_TextureMainInput); glUniform1i (текстуры [0] [displayMode], 0); где это? - person Sung; 25.02.2013
comment
Я добавил их, но без изменений. Нет никаких изменений, добавляете они их или нет, код работает нормально, шейдеры не используются. Вы можете дать мне ссылку в Интернете, чтобы узнать о них? - person peaceman; 25.02.2013
comment
Следуйте правилу: 1. компилируйте, связывайте, используйте код шейдера 2. вызовите glgetattribute, функцию glgetuniform для получения обработчика 3. отправьте значения в glsl через этот обработчик, как вызов glUniformxx (обработчик, значение) glVertexAttribPointer (обработчик, значение) - person Sung; 25.02.2013
comment
Нет, я имею в виду эту конкретную проблему, наложение текстуры с помощью glsl. Я смотрю много примеров, но все равно не могу. - person peaceman; 25.02.2013

Я тоже новичок в этом, так что поправьте меня, если я ошибаюсь, но, возможно, вместо этого должно быть что-то вроде этого? поэтому вместо glTexCoord2f и glVertex2f вы всегда используете glVertexAttrib2f и 3f в сочетании с layout (location = ???).

Проголосуйте, если это сработает для вас, ребята.

некоторые устарели, что я пробовал. glMultiTexCoord gl_texCoord

#ifdef __VERT__
#version 330

uniform mat4 cameraPV;
uniform mat4 lightPV;

layout(location = 0) in vec3 shader_vertexPosition;
layout(location = 1) in vec2 shader_textureCoord;

out vec2 shader_baseTextureCoord;
out vec4 shader_lightTextureCoord;

void main()
{
    vec4 worldPosition = vec4(shader_vertexPosition, 1);
    gl_Position = cameraPV * worldPosition;
    shader_baseTextureCoord = shader_textureCoord;
    shader_lightTextureCoord = lightPV * worldPosition;
}
#endif

static void VertexAttrib(GLuint location, glm::vec3 vector)
{
    glVertexAttrib3f(location, vector.x, vector.y, vector.z);
}

glm::vec3 pa(+50, -10, -50);
glm::vec3 pb(-50, -10, -50);
glm::vec3 pc(+50, -10, +50);
glm::vec3 pd(-50, -10, +50);

glBegin(GL_TRIANGLE_STRIP);
    glVertexAttrib2f(1, 1, 0); GLMisc::VertexAttrib(0, pa);
    glVertexAttrib2f(1, 0, 0); GLMisc::VertexAttrib(0, pb);
    glVertexAttrib2f(1, 1, 1); GLMisc::VertexAttrib(0, pc);
    glVertexAttrib2f(1, 0, 1); GLMisc::VertexAttrib(0, pd);
glEnd();
person ColacX    schedule 31.03.2013