GLSL纹理映射

GLSL纹理映射,glsl,texture-mapping,Glsl,Texture Mapping,我想用GLSL做纹理贴图。但是我想我的代码没有使用着色器。这是我的密码: 顶点 #version 330 out vec2 texcoord; void main() { gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex; texcoord=gl_MultiTexCoord0.xy; } 碎片碎片 #version 330 uniform sampler2D img; in vec2 texcoord; void m

我想用GLSL做纹理贴图。但是我想我的代码没有使用着色器。这是我的密码:

顶点

#version 330


out vec2 texcoord;

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

#version 330

uniform sampler2D img;
in vec2 texcoord;

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

}
在main中,纹理映射部分

    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();
我的代码有什么问题? 完整代码:


在我看来,着色器代码还可以。然而你从未打过电话 glGetAttriblation() glGetUniformLocation()

在调用gluniform()之前,glVertexAttribPointer()


另外,在所有这些调用之前不久,您必须调用glUseProgram()。

在我看来,着色器代码还可以。然而你从未打过电话 glGetAttriblation() glGetUniformLocation()

在调用gluniform()之前,glVertexAttribPointer()


在所有这些调用之前,您还必须调用glUseProgram()一次。

我对此也很陌生,如果我错了,请纠正我,但也许应该是这样的? 因此,您总是将glVertexAttrib2f和3f结合使用,而不是glTexCoord2f和glVertex2f 用布局(位置=???)代替

如果这对你们有用,请投票

有些人反对我的尝试。格劳特克斯库德酒店

#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();

我在这方面也是新手,所以如果我错了,请纠正我,但也许应该是这样的? 因此,您总是将glVertexAttrib2f和3f结合使用,而不是glTexCoord2f和glVertex2f 用布局(位置=???)代替

如果这对你们有用,请投票

有些人反对我的尝试。格劳特克斯库德酒店

#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();

如果你看第一个链接,我称之为shader.CompileShaders();在主循环之前。glUseProgram()就是其中之一。但是我如何使用你提到的功能呢?如果它很简单,你能写它吗?在每次调用glActiveTexture(GL_TEXTURE0)之前必须调用glUsePrograme();glBindTexture(GLU纹理2D,m纹理输入);glUniform1i(纹理[0][displayMode],0);这些在哪里?我添加了这些,但没有变化。无论是否添加它们,代码都不会正常运行,没有使用着色器。你能给我一个网络链接来学习它们吗。编译、链接、使用着色器代码2。调用glgetattribute、glgetuniform函数以获取处理程序3。通过该处理程序将值推送到glsl,比如调用glUniformxx(处理程序,值)glVertexAttribPointer(处理程序,值)否,我指的是这个特定问题,使用glsl进行纹理映射。我看了很多例子,但仍然做不到;在主循环之前。glUseProgram()就是其中之一。但是我如何使用你提到的功能呢?如果它很简单,你能写它吗?在每次调用glActiveTexture(GL_TEXTURE0)之前必须调用glUsePrograme();glBindTexture(GLU纹理2D,m纹理输入);glUniform1i(纹理[0][displayMode],0);这些在哪里?我添加了这些,但没有变化。无论是否添加它们,代码都不会正常运行,没有使用着色器。你能给我一个网络链接来学习它们吗。编译、链接、使用着色器代码2。调用glgetattribute、glgetuniform函数以获取处理程序3。通过该处理程序将值推送到glsl,比如调用glUniformxx(处理程序,值)glVertexAttribPointer(处理程序,值)否,我指的是这个特定问题,使用glsl进行纹理映射。我看了很多例子,但还是做不到。