Hallo zusammen,
ich habe ein kleines Problem mit LWJGL und BMP-Texturen. Folgendes Video sollte mein Problem deutlich machen. Rechts seht ihr eine Variante in C++ und wie es richtig aussehen sollte. Rechts ist die LWJGL Variante. Ich weiß leider nicht woran es liegt, dass es mit LWJGL falsch gerendert wird. Ich vermute aber das es beim Laden des Bildes ein Problem gibt, da der Code mit dem von der C++ Variante identisch ist.
LWJGL Texturing BMP Problem - YouTube
ich habe ein kleines Problem mit LWJGL und BMP-Texturen. Folgendes Video sollte mein Problem deutlich machen. Rechts seht ihr eine Variante in C++ und wie es richtig aussehen sollte. Rechts ist die LWJGL Variante. Ich weiß leider nicht woran es liegt, dass es mit LWJGL falsch gerendert wird. Ich vermute aber das es beim Laden des Bildes ein Problem gibt, da der Code mit dem von der C++ Variante identisch ist.
LWJGL Texturing BMP Problem - YouTube
Java:
public Texture loadTexture(String path) {
Texture texture = null;
ShortBuffer buffer = null;
int width = 0;
int height = 0;
int offset = 0;
File file = new File(path);
if (file.exists()) {
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int cache[] = new int[4];
bis.skip(10);
readData(bis, cache);
offset = parse(cache);
bis.skip(4);
readData(bis, cache);
width = parse(cache);
readData(bis, cache);
height = parse(cache);
cache = new int[width * height * 3];
bis.mark(0);
bis.reset();
bis.skip(offset);
readData(bis, cache);
buffer = BufferUtils.createShortBuffer(cache.length);
for(int i = 0;i < cache.length;i++) {
buffer.put((short)cache[i]);
}
buffer.rewind();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int id = glGenTextures();
glBindTexture(GL_TEXTURE_2D, id);
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_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, buffer);
System.out.println("Texture created -- width:[" + width + "px] height:[" + height + "px]");
texture = new Texture(id);
}
return texture;
}
Code:
Texture* BmpTextureLoader::loadTexture(std::string path)
{
GLuint textureId;
std::ifstream inputFileStream;
inputFileStream.open(path, std::ios_base::in | std::ios_base::binary);
if(inputFileStream.good())
{
long fileSize;
char* inputPuffer;
int offset;
int width;
int height;
int bitCount;
GLubyte* data;
inputFileStream.seekg(0, std::ios::end);
fileSize = inputFileStream.tellg();
inputPuffer = new char[fileSize];
inputFileStream.seekg(0, std::ios::beg);
inputFileStream.read(inputPuffer, fileSize);
inputFileStream.close();
std::string stringPuffer(inputPuffer, fileSize);
std::stringstream inputRunner(stringPuffer);
inputRunner.seekg(10, std::ios::beg);
inputRunner.read(reinterpret_cast<char*>(&offset), 4);
inputRunner.seekg(18, std::ios::beg);
inputRunner.read(reinterpret_cast<char*>(&width), 4);
inputRunner.seekg(22, std::ios::beg);
inputRunner.read(reinterpret_cast<char*>(&height), 4);
inputRunner.seekg(28, std::ios::beg);
inputRunner.read(reinterpret_cast<char*>(&bitCount), 2);
int dataSize = width * height * bitCount / 3;
data = new GLubyte[dataSize];
inputRunner.seekg(offset, std::ios::beg);
inputRunner.read((char*)data, dataSize);
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, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
delete[](inputPuffer);
delete[](data);
}
return new Texture(textureId);
}
Zuletzt bearbeitet: