Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 片段着色器忽略纹理坐标_Opengl_Glsl_Textures - Fatal编程技术网

Opengl 片段着色器忽略纹理坐标

Opengl 片段着色器忽略纹理坐标,opengl,glsl,textures,Opengl,Glsl,Textures,我正在通过在的教程学习OpenGL 我已经在一个正方形上绘制了我手工定义的3x3纹理,使用了2个三角形,没有着色器。但是,使用着色器,我不理解这种奇怪的行为: 碎片着色器似乎忽略了纹理坐标,但奇怪的是,它用第一个像素的颜色绘制了我的两个三角形。我尝试将垃圾值放入纹理坐标中,但它始终保持不变 unsigned char texture_buffer[9*4] = // 3x3 texture RGBA ... { 255,40,100,255, 100,200,200,255,

我正在通过在的教程学习OpenGL

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

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

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);
} 

如果你能就可能发生的事情提出建议,我将不胜感激。谢谢。

着色器阶段的输出通过其名称链接到下一个着色器阶段的输入(除非使用布局限定符)。看

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

因为顶点着色器中纹理坐标输出的名称是
out\u tex\u coord

out-vec2 out\u-tex\u-coord;
片段着色器中相应输入的名称也必须是
out\u tex\u coord

in-vec2-out\u-tex\u-coord;
void main()
{
FragColor=纹理(内纹理,外纹理);
} 

它可以工作!非常感谢你!我不知道这些名字是链接在一起的,并将它们定义为in和out:D