Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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
C++ 在OpenGL 3.2中使用纹理_C++_Opengl_Glsl_Librocket - Fatal编程技术网

C++ 在OpenGL 3.2中使用纹理

C++ 在OpenGL 3.2中使用纹理,c++,opengl,glsl,librocket,C++,Opengl,Glsl,Librocket,我已经盯着这个代码看了一段时间了,现在运气不好。我正在致力于将librocket集成到我自己的项目中(库对于这个问题来说并不重要),其中一部分需要编写一个渲染器类。我一直在尝试这样做,但无法显示纹理。顶点颜色和位置工作正常 我正在使用OpenGL3.2 我临时修改了代码,尝试绘制一个四边形。唯一使用的参数是texture参数,它只是一个GLuint转换为另一种类型的参数 我很有可能错过了一些愚蠢的事情,但我看不到。希望另一双眼睛能有所帮助。请随时询问更多代码/信息 //当Rocket希望渲染其不

我已经盯着这个代码看了一段时间了,现在运气不好。我正在致力于将librocket集成到我自己的项目中(库对于这个问题来说并不重要),其中一部分需要编写一个渲染器类。我一直在尝试这样做,但无法显示纹理。顶点颜色和位置工作正常

我正在使用OpenGL3.2

我临时修改了代码,尝试绘制一个四边形。唯一使用的参数是
texture
参数,它只是一个
GLuint
转换为另一种类型的参数

我很有可能错过了一些愚蠢的事情,但我看不到。希望另一双眼睛能有所帮助。请随时询问更多代码/信息

//当Rocket希望渲染其不希望优化的几何体时调用。
void SDLRenderInterface::RenderGeometry(Rocket::Core::Vertex*顶点、int num_顶点、int*索引、int num_索引、常量Rocket::Core::TextureHandle纹理、常量Rocket::Core::Vector2f&translation)
{
GLuint程序;
GLuint顶点缓冲区;
胶合指数缓冲器;
GLuint VertexLoc=0;
GLuint vertexColorLoc=0;
GLuint vertexTexCoordLoc=0;
GLuint-texloc=0;
GLuint translationLoc=0;
GLuint viewDimLoc=0;
整数偏移=8;
int vertexCount=4;
浮点顶点数据[]={-0.5,-0.5,1.0,1.0,1.0,1.0,0.0,0.0,
0.5, -0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0,
0.5,  0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
-0.5,  0.5, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0};
int indexData[]={0,1,2,0,2,3};
int indexCount=6;
//填充顶点缓冲区
glGenBuffers(1和vertexBuffer);
glBindBuffer(GL_数组_BUFFER,vertexBuffer);
glBufferData(GL_数组_缓冲区,sizeof(浮点)*偏移*顶点计数,
顶点数据、总图、静态图);
//填充索引缓冲区
glGenBuffers(1和indexBuffer);
glBindBuffer(GL_元素数组缓冲区,indexBuffer);
glBufferData(GLU元素数组缓冲区,sizeof(int)*indexCount,
索引数据、总图、静态图);
program=shaderManager->getProgram(2,“rocketTex.vert”,
“rocketTex.frag”);
glUseProgram(程序);
//设置纹理
texSamplerLoc=glGetUniformLocation(程序,“texSampler”);
vertexTexCoordLoc=glGetAttribLocation(程序,“vertexTexCoord”);
if(texSamplerLoc==-1)
{

因此,我终于找到了答案。jozxyqk关于测试纹理坐标的建议证实了我的怀疑,即纹理坐标是错的(每个顶点都得到了相同的坐标)。问题在于我调用了
glVertexAttributeDivisor(attributeLoc,1)
在我的代码的另一部分中,从未将其设置回逐顶点,因此影响了我的其他着色器。考虑到OpenGL的设计,这是有必要的


很高兴问题解决了!

因此,我终于找到了答案。jozxyqk关于测试纹理坐标的建议证实了我的怀疑,即纹理坐标不正确(每个顶点都得到了相同的坐标)。问题最终在于我调用了
glVertexAttributeDivisor(attributeLoc,1)
在我的代码的另一部分中,从未将其设置回逐顶点,因此影响了我的其他着色器。考虑到OpenGL的设计,这是有必要的


很高兴问题解决了!

代码的纹理部分在我看来很好。您如何生成/加载
纹理本身?您是否尝试过
gl_FragColor=vec4(texCoord,0,1)检查坐标是否正确?代码的纹理部分在我看来很好。如何生成/加载
纹理本身?是否尝试过
gl_FragColor=vec4(texCoord,0,1);
检查坐标是否正确?GLVERTEXATTributeDivisor仅在GL版本为3.3或更高版本时可用。GLVERTEXATTributeDivisor仅在GL版本为3.3或更高版本时可用。
#version 120

uniform vec2 translation;
uniform vec2 viewDimensions;

attribute vec2 vertexPosition;
attribute vec4 vertexColor;
attribute vec2 vertexTexCoord;

varying vec2 texCoord;
varying vec4 fragColor;

void main(void)
{
    vec2 ndcPos = ((vertexPosition + translation)/(viewDimensions));

    texCoord = vertexTexCoord;
    fragColor = vertexColor;
    gl_Position = vec4(ndcPos, 0.0, 1.0);
}
#version 120

uniform sampler2D texSampler;

varying vec2 texCoord;
varying vec4 fragColor;

void main(void)
{
    vec4 objectColor = texture2D(texSampler, texCoord);
    gl_FragColor = vec4((objectColor * fragColor).xyz, 1.0);
}