C++ OpenGL将纹理绑定到顶点缓冲区对象(使用CG着色器)

C++ OpenGL将纹理绑定到顶点缓冲区对象(使用CG着色器),c++,opengl,rendering,texture-mapping,vertex-buffer,C++,Opengl,Rendering,Texture Mapping,Vertex Buffer,我要直截了当地说: 我已经为我的顶点创建了一个结构: struct Vertex3D { 矢量三维位置; 矢量二维纹理坐标; 向量3D法线; } 然后导入一个特定的*.dae文件并将其绑定到OpenGL顶点缓冲区,该缓冲区由Vertex3D结构化顶点列表构成。一切顺利,网格导入并显示,我可以使用着色器操纵它,但我有一个问题 我还要做的是加载并为其指定纹理。之后,我尝试以以下方式显示它: GlenableVertexAttributeArray(0); GlenableVertexAttribu

我要直截了当地说:

我已经为我的顶点创建了一个结构:

struct Vertex3D
{
矢量三维位置;
矢量二维纹理坐标;
向量3D法线;
}
然后导入一个特定的*.dae文件并将其绑定到OpenGL顶点缓冲区,该缓冲区由Vertex3D结构化顶点列表构成。一切顺利,网格导入并显示,我可以使用着色器操纵它,但我有一个问题

我还要做的是加载并为其指定纹理。之后,我尝试以以下方式显示它:

GlenableVertexAttributeArray(0);
GlenableVertexAttributeArray(8);
GlenableVertexAttributeArray(2);
glBindBuffer(GL_数组_BUFFER,this->_条目[i].VB);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,sizeof(RomCommon::Vertex3D),0);//顶点
glvertexattributepointer(8,2,GL_FLOAT,GL_FALSE,sizeof(RomCommon::Vertex3D),(const GLvoid*)sizeof(RomCommon::Vector3D));//假设纹理位置
glvertexattributepointer(2,3,GL_FLOAT,GL_FALSE,sizeof(RomCommon::Vertex3D),(const GLvoid*)(sizeof(RomCommon::Vector2D)+sizeof(RomCommon::Vector3D));//假定正常位置
glBindBuffer(GL\u元素\u数组\u缓冲区,this->\u条目[i].IB);
glBindTexture(GL_纹理_2D,3);
glpaurements(GL\u三角形,this->\u条目[i]。\u indexCount,GL\u UNSIGNED\u INT,0);
glDisableVertexAttributeArray(0);
GLDisableVertexAttributeArray(8);
GLDisableVertexAttributeArray(2);
我的问题是没有显示纹理。仅指定纹理第一个像素的颜色(在我的示例中为蓝色)。我已经使用gDEBugger调试了整个过程,我可以看出VertexBuffer似乎设置正确,纹理图像加载正确,但它不会显示

我尝试过搜索和尝试调试的不同方面,包括:

  • 确保glEnable(GL_纹理_2D)已设置
  • 添加glEnable(GLU照明)和glDisable(GLU照明)
  • 使用glDisable(GLU深度测试);glDisable(GLU混合);和glDisable(GL_剪_试验);在绑定纹理之前
  • 获取错误
  • 搜索奇怪的消息
  • 仔细检查内存中的顶点缓冲区(以文字形式遍历元素并交叉比较*.dae文件中的内容)
编辑

我正在使用CG着色器。下面是顶点程序:

struct vsOutput {


 float4 position : POSITION;
  float2 texCoord : TEXCOORD0;
  float3 color    : COLOR;
};

vsOutput VS_Main(      float4 position : POSITION,
                           float2 texCoord : TEXCOORD0,
                           float3 color    : COLOR,
                           uniform float4x4 ModelViewProj
                           )
{
  vsOutput OUT;

  OUT.position = mul(ModelViewProj, position);
  OUT.texCoord = texCoord;
  OUT.color = color;

  return OUT;   
}
片段程序:

struct fsOutput {
  float4 color : COLOR;
};

fsOutput FS_Main(
    float2 texCoord : TEXCOORD0,
    uniform sampler2D decal : TEX0
)
{ 
    fsOutput OUT;
    OUT.color = tex2D(decal,texCoord);
    return OUT;
}
如果必要的话,我可以添加更多关于我的项目的细节,尽管从我跟踪的情况来看,问题似乎在顶点缓冲区的渲染中

编辑

我还发现,因为我使用的是CG,VertexAttributePointers应该是不同的(8代表TEXCOORD0),所以我基于此更改了一般描述

解决方案编辑

非常感谢评论中的几个家伙,他们打开了我的思路,从不同的角度来看待这个问题,并且实际上做了更多的阅读。以下是解决方案:

GlenableVertexAttributeArray(0);
GlenableVertexAttributeArray(8);
GlenableVertexAttributeArray(2);
glBindBuffer(GL_数组_BUFFER,this->_条目[i].VB);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,sizeof(RomCommon::Vertex3D),0);//顶点
glvertexattributepointer(8,2,GL_FLOAT,GL_FALSE,sizeof(RomCommon::Vertex3D),(const GLvoid*)sizeof(RomCommon::Vector3D));//假设纹理位置
glvertexattributepointer(2,3,GL_FLOAT,GL_FALSE,sizeof(RomCommon::Vertex3D),(const GLvoid*)(sizeof(RomCommon::Vector2D)+sizeof(RomCommon::Vector3D));//假定正常位置
glBindBuffer(GL\u元素\u数组\u缓冲区,this->\u条目[i].IB);
/*解决方案启动*/
glEnableClientState(GL_纹理_坐标_阵列);
glTexCoordPointer(2,GL_浮点,sizeof(RomCommon::Vertex3D),(const GLvoid*)12);
glBindTexture(GL_纹理_2D,3);
glpaurements(GL\u三角形,this->\u条目[i]。\u indexCount,GL\u UNSIGNED\u INT,0);
glDisableClientState(GL_纹理_坐标_数组);
/*溶液端*/
glDisableVertexAttributeArray(0);
GLDisableVertexAttributeArray(8);
GLDisableVertexAttributeArray(2);
我的问题是,我只是将纹理坐标传递给着色器,但没有将其推送到OpenGL状态机(如果这是一个好的表达式的话)。 我认为这与我使用CG着色器而不是GLSL着色器有关,尽管我可能错了。代码松散地基于我读到的一些示例和解释,但它们都基于GLSL着色器,并且它们都在工作,因此是Dedictions。 不管怎样,现在已经解决了

glBindTexture(GL_TEXTURE_2D, 3);

我会小心在OpenGL上强制使用纹理对象ID。从技术上讲,它应该可以工作,但使用获取纹理ID是一个更好的主意。

我看不到任何着色器。这可能是顶点缓冲区渲染的问题。您指定了顶点属性(0、1和2),但没有赋予它们任何意义。哦,你没有把纹理绑定到VBO;将它们绑定到纹理单元并作为GLSL中的
uniform sampler*
变量访问。我有着色器,但没有在说明中指定它们(如果需要,我可以添加顶点和片段着色器函数)。它们在GlenableVertexAttributeArray(0)之前启用;GLDisableVertexAttributeArray(2)后禁用;我也使用CG着色器,但它们的工作方式与我猜想的类似。您是否尝试将UV渲染为颜色?请原谅我的无知,我不太擅长这些。如何再次将UV渲染为颜色?@karmalis:只需将纹理坐标指定为输出颜色即可。我也有点不确定Cg是如何将顶点属性位置分配给VS_主参数的。使用GLSL,您必须使用glGetAttributeLocation根据位置索引的名称检索位置索引,或者在布局中显式分配位置索引。这样写只是为了表明我实际上正在尝试绑定纹理。实际代码如下所示:纹理->绑定(GL_TEXTURE0);t在哪里