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文件中的内容)
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在哪里