Текстура OpenGL не работает

Я пытаюсь научиться использовать текстуры в OpenGL. Я начал читать главу о наложении текстур в OpenGL Redbook. Я ничего не понял, поэтому погуглил и нашел это руководство. Я следовал инструкциям, и я до сих пор не могу заставить его работать. Это код.

Это изображение моей текстуры. Я использовал Photoshop, чтобы преобразовать его в это. Размер файла составляет 175 КБ, что является правильным размером (200x300x3=180000).

Я попытался прочитать файл в другой программе и проверить правильность содержимого. Кажется, я могу прочитать только около 221 пикселя (примерно первая строка изображения), и он достигает eof(). В моей программе я читал столько, сколько ожидал, но когда я отлаживал, я заметил, что после некоторых точек байты обнуляются.

Теперь я в замешательстве. Проблема с моей программой? Есть проблема с текстурой? Есть ли проблема со мной? Что я делаю неправильно? Как это исправить?


person atoMerz    schedule 25.12.2011    source источник


Ответы (3)


Проблема в вашем коде. Вы пытаетесь прочитать двоичный файл в текстовом режиме. Вместо этого используйте следующий код:

ifstream tex("ace.raw", ios::in | ios::binary);
if(tex.is_open())
  for(int j=0; j<imH; ++j)
    for(int i=0; i<imW; ++i)
      for(int k=0; k<3; ++k)
      {
        face[j][i][k] = tex.get();
      }

tex.close();

Или гораздо более короткий и эквивалентный код:

ifstream tex("ace.raw", ios::in | ios::binary);
if (tex.is_open())
  tex.read((char*)face, sizeof(face));

tex.close();

Оба кода протестированы, и переменная "face" содержит точно такое же содержимое, как "ace.raw".

person Osman Turan    schedule 25.12.2011
comment
К моему удивлению, это, кажется, решает эту проблему. Какая разница в чтении файла в текстовом режиме или в двоичном режиме?! он должен содержать те же данные, не так ли? - person atoMerz; 26.12.2011
comment
В текстовом режиме вы ограничены печатаемым диапазоном ASCII, и некоторые значения могут управлять поведением средства чтения, в то время как двоичный режим просто читает все, что вы сохранили. - person Osman Turan; 26.12.2011

Как проявляется текстура? Это мусор? Это просто чисто белый (т.е. без текстуры)? В зависимости от вашей видеокарты, возможно, ваши текстуры требуют степени двойки в качестве ширины/высоты и/или ваша текстура должна быть квадратной. Работает ли это без использования MIP-карт?

Даже не имея возможности прочитать файл целиком или имея в нем какие-то поврежденные данные, вы должны, по крайней мере, увидеть какой-то мусор в виде текстуры, если чтение файла сойдет с ума.

person Mario    schedule 25.12.2011
comment
Раньше он был черным (чтение нулей). Затем, немного отредактировав его, он стал серо-белым. Никакой степени двух текстур не бывает, так как решение Османа сработало. Без мипмапов результат тот же. - person atoMerz; 26.12.2011

Нет, нет проблем. Изображения могут содержать много нулевых байтов, чтобы прочитать их все и ничего не пропустить, обязательно укажите их размер.

person Dani    schedule 25.12.2011
comment
Я читаю весь файл в цикле 200x300x3 и читаю информацию RGB, игнорируя тот факт, что я читаю нули. Проблема в том, что на самом деле он также отображает нули (черная текстура)! что неправильно. Я загрузил фактическое изображение, чтобы вы могли видеть, как оно выглядит. - person atoMerz; 25.12.2011