Pertanyaan Perilaku Tekstur Aneh C ++ OpenGL


Saat ini saya mengambil kelas C ++ Game Libraries, dan untuk kelas ini sudah menjadi proyek seperempat panjang kami untuk membangun perender yang mendukung berbagai hal. Untuk laboratorium saat ini, instruktur kami memberi kami tutorial tentang memuat dalam bmp ke OpenGL secara manual, dan menerapkannya ke geometri kami.

Tutorial: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/

Setelah mengikuti tutorial ini langkah demi langkah tekstur saya memiliki beberapa perilaku yang menarik. Saya telah pergi ke teman-teman sekelas, senior, dan banyak instruktur. Tak satu pun dari mereka memiliki gagasan tentang apa yang terjadi. Menimbang bahwa hampir setiap kode seseorang identik untuk Lab ini, dan aku satu-satunya yang memiliki masalah ini, aku tidak bisa tidak bingung.

Saya menggunakan OBJ berikut, dan tekstur. Saya mengubah OBJ menjadi file biner dalam konverter OBJ yang saya buat sendiri. Perender saya mengambil file biner ini dan mengirim data ke OpenGL vertex buffer.

OBJ dan Tekstur: http://www.models-resource.com/playstation_2/ratchetclank/model/6662/

Teman saya dan saya memiliki struktur file biner yang sama, jadi saya memberinya salinan file biner saya untuk memeriksa apakah UV itu benar. Dia membuat ayam yang bertekstur sempurna, sementara pikiran membuat ayam yang terlihat seperti teksturnya dikonsentrasikan secara horizontal ke 1/16 dari panjang model, kemudian diulang beberapa kali. Saya akan memposting gambar, tapi saya baru di sini dan tidak memiliki reputasi yang cukup untuk melakukannya. Selama akhir pekan, saya melakukan yang terbaik untuk meningkatkan reputasi saya, karena saya benar-benar berpikir bahwa itu akan membantu untuk melihat masalah saya secara visual.

Saya akan memposting kode sumber saya, namun proyek ini mendekati sekitar 16.000 baris kode, dan saya ragu ada yang mau mencari melalui itu untuk menemukan masalah orang asing.

Setiap saran akan sangat membantu, saya terutama ingin tahu tentang kesalahan umum yang dapat dilakukan saat bekerja dengan tekstur OpenGL, atau .bmps secara umum.

Terima kasih ya.

// ----- Edit Satu ----- //

Hasil teman saya

One

Hasil saya

enter image description here

Saya khawatir saya tidak diizinkan menggunakan perpustakaan lain. Saya mungkin seharusnya menyebutkan itu di posting awal saya.

Berikut adalah kode tempat saya memuat di bmp, saya mendengar dari salah satu orang kelas atas di sekolah saya bahwa saya mengabaikan sesuatu yang disebut kedalaman bit. Saya tahu bahwa tutorial ini sangat buruk, dan saya lebih suka belajar melakukannya dengan benar, daripada hanya nyaris tidak mengikis. Jika ada yang memiliki sumber daya yang baik tentang hal ini, saya akan sangat menghargai yang menunjuk ke arah itu.

unsigned char header[54];
unsigned int dataPos;
unsigned int width, height;
unsigned int imageSize; 
unsigned char * data;

FILE * file = fopen(filePath, "rb");
if (!file)
{
    printf("\nImage could not be opened");
    exit(1);
}

if (fread(header, 1, 54, file) != 54){
    printf("\nNot a correct BMP file");
    exit(1);
}

if (header[0] != 'B' || header[1] != 'M'){
    printf("\nNot a correct BMP file");
    exit(1);
}

dataPos = *(int*)&(header[0x0A]);
imageSize = *(int*)&(header[0x22]);
width = *(int*)&(header[0x12]);
height = *(int*)&(header[0x16]);

if (imageSize == 0) imageSize = width * height * 3;
if (dataPos == 0) dataPos = 54;

data = new unsigned char[imageSize];

fread(data, 1, imageSize, file);

fclose(file);

glGenTextures(1, &m_textureID);

glBindTexture(GL_TEXTURE_2D, m_textureID);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

Saat ini saya menggunakan shader. Saya memiliki sebuah fragmen, dan shader verteks yang identik dengan shader yang dijelaskan dalam tutorial. Saya berdua memverifikasi masing-masing dari mereka dan memastikan bahwa mereka sedang menyusun.

// ----- Edit Dua ----- //

Jadi saya mengambil saran durhass, dan mengatur warna saya sama dengan vec3 (0,0, uv.x, uv.y) di mana uv adalah vec2 yang memegang koordinat tekstur saya, dan inilah yang saya dapatkan.

enter image description here

Jadi saya pikir saya bisa melihat akar masalahnya. Saya berpikir bahwa saya tidak menyimpan uvs saya dengan benar di buffer gl saya. Saya tidak berpikir itu masalah dengan UV file biner mengingat bahwa itu berfungsi dengan baik dengan mesin teman saya. Il lihat ini, terima kasih atas sarannya, ini mungkin mengarah pada perbaikan!


5
2017-08-29 06:59


asal


Jawaban: