我正在与一些朋友一起做一个单身汉项目,而且我们遇到了一个非常混乱的OpenGL纹理错误。而且我想知道这里有没有关于这些事情的知识...
我们遇到的问题是,在我们的笔记本电脑(运行英特尔高清显卡)上,我们可以看到纹理很好。但是,如果我们将其改为在专用显卡上运行,我们就无法看到纹理。我们无法在我们的桌面上看到他们使用专用的Craphics卡(AMD和Nvidia)。
那么,那是什么呢?有什么想法吗?
编辑:添加纹理&渲染代码,不是我做的所以我不知道它是如何工作的。但我想我找到了一切。
纹理加载:
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);
}
绘制:
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);
}
}
答案 0 :(得分:1)
不要将纹理坐标大小除以2(将坐标切成两半),并且不传递向量的地址(这将给出未定义的结果,因为不能保证{{1的内存布局}})。
std::vector
请注意这是如何使用glBufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * texCoords.size(), &texCoords [0], GL_STATIC_DRAW);
std::vector
返回的引用地址的? C ++ 03保证内部用于元素存储的内存是一个连续的数组。许多早期的C ++标准库实现都是这样的,但规范。不保证。 C ++ 11添加了operator []
,它有效地做了同样的事情,但是使你的代码需要更新的编译器。