C++ 如何让纹理在OpenGL中工作?

C++ 如何让纹理在OpenGL中工作?,c++,opengl,textures,C++,Opengl,Textures,我正在使用上的教程学习OpenGL,这是必需的,我必须使用它。我主要想将教程15中的纹理应用到教程7(带UBO的世界)中的对象上 现在看来,纹理只有在mipmap打开时才起作用。这带来了一个缺点:唯一使用的mipmap是索引为零的mipmap,这是1色1x1像素的mipmap。我试着将mipmap的最低级别设置得更高,或者完全关闭mipmap,但即使这样也无法解决问题,因为这样一切都会变得漆黑一片。现在我将列出程序中最重要的部分 编辑:我想我会添加更多细节… //----------------

我正在使用上的教程学习OpenGL,这是必需的,我必须使用它。我主要想将教程15中的纹理应用到教程7(带UBO的世界)中的对象上

现在看来,纹理只有在mipmap打开时才起作用。这带来了一个缺点:唯一使用的mipmap是索引为零的mipmap,这是1色1x1像素的mipmap。我试着将mipmap的最低级别设置得更高,或者完全关闭mipmap,但即使这样也无法解决问题,因为这样一切都会变得漆黑一片。现在我将列出程序中最重要的部分

编辑:我想我会添加更多细节…

//------------------------------------------------------------------------------
// enum of VBO locations (it is also your layout location) I use enums for simple in code changes
enum _vbo_enum
    {
    _vbo_pos=0,     // glVertex
    _vbo_col,       // glColor
    _vbo_tan,       // glNormal
    _vbo_unused0,   // unused (at least i dont see anything at this location in your code)
    _vbo_unused1,   // unused (at least i dont see anything at this location in your code)
    _vbo_txr,       // glTexCoord
    _vbos
    };
//------------------------------------------------------------------------------
// 'global' names and size for OpenGL mesh in VAO/VBO ... similar ot texture names/handles
GLuint vao[1],vbo[_vbos],num_pnt=0;
//------------------------------------------------------------------------------
void VAO_init_cube()    // call this before VAO use,...but after OpenGL init !
    {
    //[1] first you need some model to render (mesh), here is a simple cube
    // size,position of cube - change it that it is visible in your scene
    const GLfloat a=1.0,x=0.0,y=0.0,z=0.0;
    // cube points 3f x,y,z
    GLfloat mesh_pos[]=
        {
        x-a,y-a,z-a,x-a,y+a,z-a,x+a,y+a,z-a,x+a,y-a,z-a,
        x-a,y-a,z+a,x-a,y+a,z+a,x+a,y+a,z+a,x+a,y-a,z+a,
        x-a,y-a,z-a,x-a,y-a,z+a,x+a,y-a,z+a,x+a,y-a,z-a,
        x-a,y+a,z-a,x-a,y+a,z+a,x+a,y+a,z+a,x+a,y+a,z-a,
        x-a,y-a,z-a,x-a,y+a,z-a,x-a,y+a,z+a,x-a,y-a,z+a,
        x+a,y-a,z-a,x+a,y+a,z-a,x+a,y+a,z+a,x+a,y-a,z+a,
        };
    // cube colors 3f r,g,b
    GLfloat mesh_col[]=
        {
        0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,
        0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,
        0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,
        0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,
        1.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,
        };
    // cube normals 3f x,y,z
    GLfloat mesh_tan[]=
        {
        -0.6,-0.6,-0.6,-0.6,+0.6,-0.6,+0.6,+0.6,-0.6,+0.6,-0.6,-0.6,
        -0.6,-0.6,+0.6,-0.6,+0.6,+0.6,+0.6,+0.6,+0.6,+0.6,-0.6,+0.6,
        -0.6,-0.6,-0.6,-0.6,-0.6,+0.6,+0.6,-0.6,+0.6,+0.6,-0.6,-0.6,
        -0.6,+0.6,-0.6,-0.6,+0.6,+0.6,+0.6,+0.6,+0.6,+0.6,+0.6,-0.6,
        -0.6,-0.6,-0.6,-0.6,+0.6,-0.6,-0.6,+0.6,+0.6,-0.6,-0.6,+0.6,
        +0.6,-0.6,-0.6,+0.6,+0.6,-0.6,+0.6,+0.6,+0.6,+0.6,-0.6,+0.6,
        };
    // cube texture coords 2f s,t
    GLfloat mesh_txr[]=
        {
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        };
    // init VAO/VBO
    glGenVertexArrays(1,vao);   // allocate 1 x VAO
    glGenBuffers(_vbos,vbo);    // allocate _vbos x VBO
    // copy mesh to VAO/VBO ... after this you do not need the mesh anymore
    GLint i,sz,n;               // n = number of numbers per 1 entry
    glBindVertexArray(vao[0]);
    num_pnt=sizeof(mesh_pos)/(sizeof(GLfloat)*3);   // num of all points in mesh

    i=_OpenGLVAOgfx_pos; n=3; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_pos,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    i=_OpenGLVAOgfx_col; n=3; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_col,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    i=_OpenGLVAOgfx_tan; n=3; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_tan,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    i=_OpenGLVAOgfx_txr; n=2; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_txr,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    glBindVertexArray(0);
    }
//------------------------------------------------------------------------------
void VAO_draw() // call this to draw your mesh,... need to enable and bind textures,...  before use
    {
    glDisable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glBindVertexArray(vao[0]);
     glEnableVertexAttribArray(_vbo_pos);
     glEnableVertexAttribArray(_vbo_col);
     glEnableVertexAttribArray(_vbo_tan);
    glDisableVertexAttribArray(_vbo_unused0);
     glEnableVertexAttribArray(_vbo_txr);

    glDrawArrays(GL_QUADS,0,num_pnt);

    glDisableVertexAttribArray(_vbo_pos);
    glDisableVertexAttribArray(_vbo_col);
    glDisableVertexAttribArray(_vbo_tan);
    glDisableVertexAttribArray(_vbo_unused0);
    glDisableVertexAttribArray(_vbo_unused1);
    glDisableVertexAttribArray(_vbo_txr);
    glBindVertexArray(0);
    }
//------------------------------------------------------------------------------
void VAO_exit() // clean up ... call this when you do not need VAO/VBO anymore
    {
    glDisableVertexAttribArray(_vbo_pos);
    glDisableVertexAttribArray(_vbo_col);
    glDisableVertexAttribArray(_vbo_tan);
    glDisableVertexAttribArray(_vbo_unused0);
    glDisableVertexAttribArray(_vbo_unused1);
    glDisableVertexAttribArray(_vbo_txr);
    glBindVertexArray(0);
    glDeleteVertexArrays(1,vao);
    glDeleteBuffers(_vbos,vbo);
    }
//------------------------------------------------------------------------------
顶点着色器具有如下内容:

#version 330

layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;
layout(location = 2) in vec3 normal;
//Added these later 
layout(location = 5) in vec2 texCoord;
out vec2 colorCoord;

smooth out vec4 interpColor;
out vec3 vertexNormal;
out vec3 modelSpacePosition;
out vec3 cameraSpacePosition;

uniform mat4 worldToCameraMatrix;
uniform mat4 modelToWorldMatrix;
uniform mat3 normalModelToCameraMatrix;
uniform vec3 dirToLight;
uniform vec4 lightIntensity;
uniform vec4 ambientIntensity;
uniform vec4 baseColor;

uniform mat4 cameraToClipMatrix;

void main()
{
vertexNormal = normal;
vec3 normCamSpace = normalize(normalModelToCameraMatrix * vertexNormal);
cameraSpacePosition = normCamSpace;

float cosAngIncidence = dot(normCamSpace, dirToLight);
cosAngIncidence = clamp(cosAngIncidence, 0, 1);
modelSpacePosition.x = position.x;
modelSpacePosition.y = position.y;
modelSpacePosition.z = position.z;

vec4 temp = modelToWorldMatrix * position;
temp = worldToCameraMatrix * temp;
gl_Position = cameraToClipMatrix * temp;

interpColor = ((lightIntensity * cosAngIncidence) + (ambientIntensity)) * baseColor;
colorCoord= texCoord ;
}
片段着色器如下所示:

#version 330
in vec3 vertexNormal;
in vec3 modelSpacePosition;

smooth in vec4 interpColor;

uniform vec3 modelSpaceLightPos;
uniform vec4 lightIntensity2;
uniform vec4 ambientIntensity2;

out vec4 outputColor;

//Added later
in vec2 colorCoord;
uniform sampler2D colorTexture;


void main()
{
vec3 lightDir2 = normalize(modelSpacePosition - modelSpaceLightPos);

float cosAngIncidence2 = dot(normalize(vertexNormal), lightDir2);
cosAngIncidence2 = clamp(cosAngIncidence2, 0,  1);

float light2DistanceSqr = dot(modelSpacePosition - modelSpaceLightPos, modelSpacePosition - modelSpaceLightPos);

//added
vec4 texture2 = texture(colorTexture, colorCoord);

outputColor = ((ambientIntensity2 + (interpColor*2))/4) + 
((((interpColor) * lightIntensity2/200 * cosAngIncidence2) + (ambientIntensity2* interpColor )) 
/( ( sqrt(light2DistanceSqr) + light2DistanceSqr)/200 ));
//No outputColor for texture testing
outputColor =  texture2 ; 

}
}
那两个都是着色器。以下是添加到.cpp的部分:

#include <glimg/glimg.h>
#include "../framework/directories.h"     
[...]
const int g_colorTexUnit = 0;
GLuint g_checkerTexture = 0;
然后在渲染对象时:

glActiveTexture(GL_TEXTURE0 + g_colorTexUnit);
glBindTexture(GL_TEXTURE_2D,g_checkerTexture);
g_pLeftMesh->Render();
glBindSampler(g_colorTexUnit, 0);
glBindTexture(GL_TEXTURE_2D, 0);

有了这些,我的所有东西都变成了黑色,但是当我把outputColor方程改为“texture+outputColor;”时,一切看起来都正常。我不知道我做错了什么。一位朋友试图帮助我,我们删除了一些不必要的东西,但我们没有运行任何东西。

您未能添加纹理可能是因为:

  • 是否已将纹理坐标添加到对象?(这是最可能的原因,因为您正在将纹理添加到非纹理教程),将纹理添加到VAO
  • 您是否添加了统一的纹理单位(
    Sampler2D
    )?(必须均匀,否则纹理无法正常工作)
  • 您的纹理是否已加载、绑定、启用(
    GL\u texture\u 2D
  • 您的活动纹理单元是-
    0
    ?如果不更改布局/多纹理坐标或设置活动纹理
    0
这两个代码是简单的纹理着色器(纹理单元
0
),没有特殊的东西(如灯光、混合、凹凸等):


tm_l2g
是变换局部对象空间->世界空间(Modelview)
tm_g2s
是变换世界空间->屏幕空间(投影)
pos
是顶点坐标
txt
是纹理坐标
col
是颜色

不要忘记将统一名称和布局位置更改为您的名称和布局位置

顶点:

//------------------------------------------------------------------
#version 420 core
//------------------------------------------------------------------
uniform mat4x4 tm_l2g;
uniform mat4x4 tm_g2s;

layout(location=0) in vec3 pos;
layout(location=1) in vec4 col;
layout(location=2) in vec2 txr;

out smooth vec4 pixel_col;
out smooth vec2 pixel_txr;
//------------------------------------------------------------------
void main(void)
    {
    vec4 p;
    p.xyz=pos;
    p.w=1.0;
    p=tm_l2g*p;
    p=tm_g2s*p;
    gl_Position=p;
    pixel_col=col;
    pixel_txr=txr;
    }
//------------------------------------------------------------------
//------------------------------------------------------------------
#version 420 core
//------------------------------------------------------------------
in smooth vec4 pixel_col;
in smooth vec2 pixel_txr;
uniform sampler2D   txr_texture0;
out layout(location=0) vec4 frag_col;
//------------------------------------------------------------------
void main(void)
    {
    vec4 col;
    col=texture(txr_texture0,pixel_txr.st);
    frag_col=col*pixel_col;
    }
//------------------------------------------------------------------
片段:

//------------------------------------------------------------------
#version 420 core
//------------------------------------------------------------------
uniform mat4x4 tm_l2g;
uniform mat4x4 tm_g2s;

layout(location=0) in vec3 pos;
layout(location=1) in vec4 col;
layout(location=2) in vec2 txr;

out smooth vec4 pixel_col;
out smooth vec2 pixel_txr;
//------------------------------------------------------------------
void main(void)
    {
    vec4 p;
    p.xyz=pos;
    p.w=1.0;
    p=tm_l2g*p;
    p=tm_g2s*p;
    gl_Position=p;
    pixel_col=col;
    pixel_txr=txr;
    }
//------------------------------------------------------------------
//------------------------------------------------------------------
#version 420 core
//------------------------------------------------------------------
in smooth vec4 pixel_col;
in smooth vec2 pixel_txr;
uniform sampler2D   txr_texture0;
out layout(location=0) vec4 frag_col;
//------------------------------------------------------------------
void main(void)
    {
    vec4 col;
    col=texture(txr_texture0,pixel_txr.st);
    frag_col=col*pixel_col;
    }
//------------------------------------------------------------------
[edit1]CPU旧式OpenGL渲染代码(初始化不包括在可找到的唯一渲染代码中)

[edit2]好,这里是VAO/VBO渲染代码,

//------------------------------------------------------------------------------
// enum of VBO locations (it is also your layout location) I use enums for simple in code changes
enum _vbo_enum
    {
    _vbo_pos=0,     // glVertex
    _vbo_col,       // glColor
    _vbo_tan,       // glNormal
    _vbo_unused0,   // unused (at least i dont see anything at this location in your code)
    _vbo_unused1,   // unused (at least i dont see anything at this location in your code)
    _vbo_txr,       // glTexCoord
    _vbos
    };
//------------------------------------------------------------------------------
// 'global' names and size for OpenGL mesh in VAO/VBO ... similar ot texture names/handles
GLuint vao[1],vbo[_vbos],num_pnt=0;
//------------------------------------------------------------------------------
void VAO_init_cube()    // call this before VAO use,...but after OpenGL init !
    {
    //[1] first you need some model to render (mesh), here is a simple cube
    // size,position of cube - change it that it is visible in your scene
    const GLfloat a=1.0,x=0.0,y=0.0,z=0.0;
    // cube points 3f x,y,z
    GLfloat mesh_pos[]=
        {
        x-a,y-a,z-a,x-a,y+a,z-a,x+a,y+a,z-a,x+a,y-a,z-a,
        x-a,y-a,z+a,x-a,y+a,z+a,x+a,y+a,z+a,x+a,y-a,z+a,
        x-a,y-a,z-a,x-a,y-a,z+a,x+a,y-a,z+a,x+a,y-a,z-a,
        x-a,y+a,z-a,x-a,y+a,z+a,x+a,y+a,z+a,x+a,y+a,z-a,
        x-a,y-a,z-a,x-a,y+a,z-a,x-a,y+a,z+a,x-a,y-a,z+a,
        x+a,y-a,z-a,x+a,y+a,z-a,x+a,y+a,z+a,x+a,y-a,z+a,
        };
    // cube colors 3f r,g,b
    GLfloat mesh_col[]=
        {
        0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,
        0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,
        0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,
        0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,
        1.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,
        };
    // cube normals 3f x,y,z
    GLfloat mesh_tan[]=
        {
        -0.6,-0.6,-0.6,-0.6,+0.6,-0.6,+0.6,+0.6,-0.6,+0.6,-0.6,-0.6,
        -0.6,-0.6,+0.6,-0.6,+0.6,+0.6,+0.6,+0.6,+0.6,+0.6,-0.6,+0.6,
        -0.6,-0.6,-0.6,-0.6,-0.6,+0.6,+0.6,-0.6,+0.6,+0.6,-0.6,-0.6,
        -0.6,+0.6,-0.6,-0.6,+0.6,+0.6,+0.6,+0.6,+0.6,+0.6,+0.6,-0.6,
        -0.6,-0.6,-0.6,-0.6,+0.6,-0.6,-0.6,+0.6,+0.6,-0.6,-0.6,+0.6,
        +0.6,-0.6,-0.6,+0.6,+0.6,-0.6,+0.6,+0.6,+0.6,+0.6,-0.6,+0.6,
        };
    // cube texture coords 2f s,t
    GLfloat mesh_txr[]=
        {
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
        };
    // init VAO/VBO
    glGenVertexArrays(1,vao);   // allocate 1 x VAO
    glGenBuffers(_vbos,vbo);    // allocate _vbos x VBO
    // copy mesh to VAO/VBO ... after this you do not need the mesh anymore
    GLint i,sz,n;               // n = number of numbers per 1 entry
    glBindVertexArray(vao[0]);
    num_pnt=sizeof(mesh_pos)/(sizeof(GLfloat)*3);   // num of all points in mesh

    i=_OpenGLVAOgfx_pos; n=3; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_pos,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    i=_OpenGLVAOgfx_col; n=3; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_col,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    i=_OpenGLVAOgfx_tan; n=3; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_tan,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    i=_OpenGLVAOgfx_txr; n=2; sz=sizeof(GLfloat)*n;
    glBindBuffer(GL_ARRAY_BUFFER,vbo[i]);
    glBufferData(GL_ARRAY_BUFFER,sz*num_pnt,mesh_txr,GL_STATIC_DRAW);
    glEnableVertexAttribArray(i);
    glVertexAttribPointer(i,n,GL_FLOAT,GL_FALSE,0,0);

    glBindVertexArray(0);
    }
//------------------------------------------------------------------------------
void VAO_draw() // call this to draw your mesh,... need to enable and bind textures,...  before use
    {
    glDisable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glBindVertexArray(vao[0]);
     glEnableVertexAttribArray(_vbo_pos);
     glEnableVertexAttribArray(_vbo_col);
     glEnableVertexAttribArray(_vbo_tan);
    glDisableVertexAttribArray(_vbo_unused0);
     glEnableVertexAttribArray(_vbo_txr);

    glDrawArrays(GL_QUADS,0,num_pnt);

    glDisableVertexAttribArray(_vbo_pos);
    glDisableVertexAttribArray(_vbo_col);
    glDisableVertexAttribArray(_vbo_tan);
    glDisableVertexAttribArray(_vbo_unused0);
    glDisableVertexAttribArray(_vbo_unused1);
    glDisableVertexAttribArray(_vbo_txr);
    glBindVertexArray(0);
    }
//------------------------------------------------------------------------------
void VAO_exit() // clean up ... call this when you do not need VAO/VBO anymore
    {
    glDisableVertexAttribArray(_vbo_pos);
    glDisableVertexAttribArray(_vbo_col);
    glDisableVertexAttribArray(_vbo_tan);
    glDisableVertexAttribArray(_vbo_unused0);
    glDisableVertexAttribArray(_vbo_unused1);
    glDisableVertexAttribArray(_vbo_txr);
    glBindVertexArray(0);
    glDeleteVertexArrays(1,vao);
    glDeleteBuffers(_vbos,vbo);
    }
//------------------------------------------------------------------------------
[edit3]如果您是win32/64用户,可以尝试我的IDE for GLSL

它非常简单易用,但无法更改纹理/属性位置。按
[F1]
以获取帮助<代码>[F9]用于运行
[F10]
以返回到正常OpenGL模式。txt编辑器有时也有点小问题,但对于我来说已经足够了


好了,伙计们,我一直在做这件事,并设法让它运行起来。首先,我必须添加采样器:

GLuint g_samplers;

//Add Later
void CreateSamplers()
{
glGenSamplers(1, &g_samplers);

    glSamplerParameteri(g_samplers, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glSamplerParameteri(g_samplers, GL_TEXTURE_WRAP_T, GL_REPEAT);

//Linear mipmap Nearest
glSamplerParameteri(g_samplers, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glSamplerParameteri(g_samplers, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
我还将此添加到文件中:

glimg::OpenGLPixelTransferParams xfer = glimg::GetUploadFormatType(pImageSet->GetFormat(), 0);

glimg::SingleImage image = pImageSet->GetImage(0, 0, 0);
glimg::Dimensions dims = image.GetDimensions();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dims.width, dims.height, 0, 
  xfer.format, xfer.type, image.GetImageData());
xfer变量会根据dds调整格式和类型。 渲染代码也变成了这样:

//Added necessary 
glActiveTexture(GL_TEXTURE0 + g_colorTexUnit);
glBindTexture(GL_TEXTURE_2D,g_checkerTexture);
glBindSampler(g_colorTexUnit, g_samplers);
g_pLeftMesh->Render();
glBindSampler(g_colorTexUnit, 0);
glBindTexture(GL_TEXTURE_2D, 0);
当然,在init()的末尾,我需要添加CreateSamplers:

//Added this later
LoadCheckerTexture();
CreateSamplers();

我为所有这些麻烦感到抱歉,但我猜OpenGL真的是如此令人困惑,我真是太幸运了,我把它弄对了。只需发布此内容,以便人们知道结尾的这一行是什么:glBindSampler(g_colorTexUnit,0);。。。也许应该是glActiveTexture?第二件事:您是否在着色器中设置了统一:glUniform1i(“colorTexture”,g_colorTexUnit)?编译着色器时可能会出现一些错误,因为变量名纹理与函数名纹理()匹配?请尝试重命名。@fen:这就是在OpenGL 3.3+中如何解除采样器对象的绑定。我不认为这有什么错,因为arcsynthesis教程教现代OpenGL(包括用于更改纹理状态的采样器对象)@fen:根据Andon所说,这应该没有什么区别。。。@user1837009:试过了,改名为texture2,仍然没有什么不同。我很感谢这里的帮助,但这似乎没有太大的改变。为了提供更多的输入,我对着色器进行了扩展。不知道,这是否会使帮助我变得更容易。您的着色器现在看起来不错,但在CPU代码中,您需要将texcoords添加到网格中。(它们来自非纹理教程,因此很可能没有纹理坐标)检查调用glTexCoord2f(0.1,0.1);在网格渲染之前,查看颜色是否更改。如果是,这意味着您的mash没有纹理坐标,需要添加它们(在CPU代码中,而不是在着色器中!),您也可以尝试不同的纹理坐标,而不仅仅是0.1,0.1,只是为了上岸(我不知道您的纹理看起来如何,它的想法是与您现在的颜色不同),我恐怕无法应用它所声称的“glTexCoord2f(0.1,0.1);”“glTexCoord2f“是未定义的。然后我再次怀疑我是否应该应用这一点,因为教程从未使用过它。。。。我也不知道还能尝试什么。这很奇怪,glTexCoord是标准的OpenGL 1.0函数,所以它一定在那里,。。。现代GLSL使用VAO代替。。。您需要创建另一个用textcoords填充的VBO,并将其绑定到VAO,而不是使用GltexCoords,但是对于测试来说,我之前写的应该足够了