Opengl 纹理渲染错误?
我正在和一些freinds做一个学士学位项目,我们遇到了一个OpenGL纹理的相当混乱的bug。我想知道这里是否有关于这些事情的知识 我们面临的问题是,在笔记本电脑上(运行英特尔高清图形),我们可以很好地看到纹理。但如果我们将其改为在专用图形卡上运行,我们就看不到纹理。在我们的台式机上,我们也看不到有专门的垃圾卡(AMD和Nvidia) 那么,这是怎么回事?有什么想法吗 编辑:添加了纹理和渲染代码,不是我做的,所以我不知道它是如何100%工作的。但我想我找到了一切 纹理加载:Opengl 纹理渲染错误?,opengl,textures,gpu,Opengl,Textures,Gpu,我正在和一些freinds做一个学士学位项目,我们遇到了一个OpenGL纹理的相当混乱的bug。我想知道这里是否有关于这些事情的知识 我们面临的问题是,在笔记本电脑上(运行英特尔高清图形),我们可以很好地看到纹理。但如果我们将其改为在专用图形卡上运行,我们就看不到纹理。在我们的台式机上,我们也看不到有专门的垃圾卡(AMD和Nvidia) 那么,这是怎么回事?有什么想法吗 编辑:添加了纹理和渲染代码,不是我做的,所以我不知道它是如何100%工作的。但我想我找到了一切 纹理加载: Texture::
Texture::Texture(const char* imagepath)
{
textureImage = IMG_Load(imagepath);
if (!textureImage)
{
fprintf(stderr, "Couldn't load %s.\n", imagepath);
}
else{
textureID = 0;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,
0, GL_RGB,
textureImage->w,
textureImage->h,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
textureImage->pixels);
SDL_FreeSurface(textureImage);
}
}
平台VBO:
PlatformVBO::PlatformVBO() {
glGenBuffers(1, &vboID);
glGenBuffers(1, &colorID);
glGenBuffers(1, &texID);
//glGenBuffers(1, &indID);
texCoords.push_back(0.0f);
texCoords.push_back(0.0f);
texCoords.push_back(1.0f);
texCoords.push_back(0.0f);
texCoords.push_back(1.0f);
texCoords.push_back(1.0f);
texCoords.push_back(0.0f);
texCoords.push_back(1.0f);
//
indices.push_back(0);
indices.push_back(1);
indices.push_back(2);
indices.push_back(0);
indices.push_back(2);
indices.push_back(3);
bgTexture = new Texture("./Texture/shiphull.png");
platform = new Texture("./Texture/Abstract_Vector_Background.png");
// Give the image to OpenGL
glBindBuffer(GL_ARRAY_BUFFER, texID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *texCoords.size() / 2, &texCoords, GL_STATIC_DRAW);
//glBindBuffer(GL_ARRAY_BUFFER, texID);
//glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *texCoords.size() / 2, &texCoords, GL_STATIC_DRAW);
}
更新VBO:
void PlatformVBO::setVBO(){
// Vertices:
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *vertices.size(), &vertices.front(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *colors.size(), &colors.front(), GL_STATIC_DRAW);
}
抽签:
不要将纹理坐标大小除以2(这会将坐标减半),也不要传递向量的地址(这会给出未定义的结果,因为无法保证
std::vector
的内存布局)
改用这个:
注意这是如何使用
std::vector
的操作符[]
返回的引用地址的?C++03保证内部用于元素存储的内存是连续数组。C++标准库的许多早期实现都是这样工作的,但是规范并不能保证它。C++11添加了std::vector::data()
,有效地实现了同样的功能,但使您的代码需要更新的编译器。“适用于英特尔,但不适用于其他供应商”这一说法非常模糊。尝试启动OpenGL调试上下文并阅读调试消息,或者至少在一些地方使用glGetError来尝试了解更多信息。如果你需要更多的帮助,你可能应该发布更多的细节。虽然没有错误。它运行良好,只是我们看不到纹理。是的,我知道这有点模糊。但这大概是我唯一需要帮助的时候了(x)至少为我们提供一些关于如何上传和绑定纹理的代码为什么要创建/填充IBO,然后不在glPaureElements()
调用中使用它(如果要使用绑定的IBO,最后一个参数应该是字节偏移量而不是客户端指针)?
void PlatformVBO::drawTexture(){
if (vertices.size() > 0){
setVBO();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indID);
//Enable states, and render (as if using vertex arrays directly)
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexPointer(2, GL_FLOAT, 0, 0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, texID);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
if (bgTexture->GetTexture() >= 0) {
glEnable(GL_TEXTURE_2D); // Turn on Texturing
// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBindTexture(GL_TEXTURE_2D, bgTexture->GetTexture());
}
//Draw the thing!
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);
//restore the GL state back
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
if (bgTexture->GetTexture() >= 0) {
glDisable(GL_TEXTURE_2D); // Turn off Texturing
glBindTexture(GL_TEXTURE_2D, bgTexture->GetTexture());
}
glBindBuffer(GL_ARRAY_BUFFER, 0); //Restore non VBO mode
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
}
glBufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * texCoords.size(), &texCoords [0], GL_STATIC_DRAW);