【问题标题】:GLSL Texture MappingGLSL 纹理映射
【发布时间】:2013-03-31 19:40:52
【问题描述】:

我想用 GLSL 做纹理映射。但我想我的代码不使用着色器。这是我的代码:

顶点.vert

#version 330


out vec2 texcoord;

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

片段.frag

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

我的代码有什么问题? 完整代码:

http://codepad.org/O096OoKU

http://codepad.org/m3Snroyv

http://codepad.org/8zvJ4Vrp

【问题讨论】:

    标签: glsl texture-mapping


    【解决方案1】:

    在我看来,着色器代码没问题。但是你从来没有打电话 glGetAttribLocation() glGetUniformLocation()

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

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

    【讨论】:

    • 如果您查看第一个链接,我将调用 shader.CompileShaders();在主循环之前。 glUseProgram() 就在其中。但是我怎样才能使用你提到的功能呢?简单的话可以写吗?
    • 必须在每次调用 glActiveTexture(GL_TEXTURE0) 之前调用 glUsePrograme(); glBindTexture(GL_TEXTURE_2D, m_TextureMainInput); glUniform1i(textures[0][displayMode], 0);这些在哪里?
    • 我添加了这些,但没有变化。添加它们与代码是否正常运行没有任何变化,着色器没有被使用。你能给我一个互联网链接来学习它们吗?
    • 遵循规则,1. 编译,链接,使用着色器代码 2. 调用 glgetattribute, glgetuniform 函数来获取处理程序 3. 通过该处理程序将值推送到 glsl,例如调用 glUniformxx(handler,value) glVertexAttribPointer(处理程序,值)
    • 不,我的意思是这个特定的问题,使用 glsl 的纹理映射。我看了很多例子,但还是做不到。
    【解决方案2】:

    我也是新手,如果我错了,请纠正我,但也许它应该是这样的? 所以你总是使用 glVertexAttrib2f 和 3f 而不是 glTexCoord2f 和 glVertex2f 用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2012-09-07
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多