片段着色器忽略纹理坐标

棕褐色

我通过教程善于学习的OpenGL learnopengl.com

我已经使用2个没有着色器的三角形将手工定义的3x3纹理绘制到正方形上。但是,使用着色器,我不理解这种奇怪的行为:

片段着色器似乎忽略了纹理坐标,但是奇怪地用第一个像素的颜色绘制了我的两个三角形。我尝试将垃圾值放入纹理坐标中,并且它始终保持不变。

unsigned char texture_buffer[9*4] = // 3x3 texture RGBA ...
{   
    255,40,100,255,  100,200,200,255,  150,150,200,255,
    100,100,150,255, 200,200,100,255,  150,200,150,255,
    150,100,100,255, 200,100,200,255,  200,150,150,255
};
float positions_texcoords[] =
{   //    x              y            z               tex coords
        0.0f,           0.0f,       0.0f,           0.0f, 0.0f,
        0.5f,           0.0f,       0.0f,           1.0f, 0.0f,
        0.0f,           0.5f,       0.0f,           0.0f, 1.0f,
        0.5f,         0.5f,       0.0f,           1.0f, 1.0f,
        0.5f,         0.0f,       0.0f,           1.0f, 0.0f,
        0.0f,         0.5f,       0.0f,           0.0f, 1.0f
};

一次抽奖电话:

    GLuint texture = 0;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, (void *)texture_buffer );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    unsigned int VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(positions_texcoords), 
                   positions_texcoords, GL_STATIC_DRAW);

        // position attribute
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

        // texture coord attribute
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(1);


    glClearColor(0.3f, 0.0f, 0.1f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, texture);

    glUseProgram(shader_program_id);
    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, 6);


    SwapBuffers(window_dc);

顶点着色器:

#version 330 core
layout (location = 0) in vec3 in_pos;
layout (location = 1) in vec2 in_tex_coord;

out vec2 out_tex_coord;

void main()
{
    gl_Position = vec4(in_pos, 1.0);
    out_tex_coord = in_tex_coord;
}

片段着色器:

#version 330 core      
out vec4 FragColor;  

in vec2 in_tex_coord;
uniform sampler2D in_texture;

void main()
{
    FragColor = texture(in_texture, in_tex_coord);
} 

对于可能发生的任何事情,我将不胜感激。谢谢。

拉比德76

着色器阶段的输出通过其名称链接到下一个着色器阶段的输入(使用布局限定符时除外)。请参见着色器阶段之间的接口匹配规则。

片段着色器输入变量的名称必须与顶点着色器输出变量的名称相同。

由于顶点着色器中输出的纹理坐标的名称为 out_tex_coord

out vec2 out_tex_coord;

片段着色器中相应输入的名称也必须为out_tex_coord

in vec2 out_tex_coord;

void main()
{
    FragColor = texture(in_texture, out_tex_coord);
} 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

非片段着色器中的纹理查找如何工作?

如何在Metal中的片段着色器中获取片段坐标?

使用Vulkan在片段着色器中缓慢提取纹理

如何设置片段着色器的读取和写入纹理?

片段着色器中的多个纹理输出数据

从片段着色器中的纹理进行边缘/轮廓检测

着色器和纹理坐标存在问题

片段着色器如何精确地进行纹理处理?

GLSL ES1.0并将纹理单元索引传递给片段着色器?

在片段着色器中读取自定义纹理格式

在Frag着色器中接收非规范化的输出纹理坐标

Threejs:在片段着色器中计算投影坐标

优化片段着色器

PyOpenGL片段着色器纹理采样

在顶点着色器中应用Y旋转时,纹理坐标移动

片段着色器中的纹理函数给出错误

为什么有些像素在片段着色器中采样了错误的纹理?

在使用片段着色器应用波浪效果时,防止在WebGL中出现纹理边界扭曲

如何在OpenGLES中为多个对象上的多个纹理设置片段着色器?

隧道着色器(从WebGL转换为OpenGL)-纹理坐标不匹配?

WebGL / three.js片段着色器-用alpha透明色覆盖alpha透明纹理

glsl片段着色器计算纹理位置

片段着色器旋转

将float数组作为3D纹理传递给GLSL片段着色器

OpenGL片段着色器返回纹理的固定颜色

片段着色器中的OpenGL纹理为黑色

为什么用片段着色器进行纹理映射时会在纹理坐标跳跃时生成线条?

片段着色器中的纹理读取

OpenGL几何着色器传递纹理坐标