Я пытаюсь понять, как значение GL_UNSIGNED_INT
преобразуется в GL_RGBA8_SNORM
и обратно, используя glTexImage2D
и glGetTexImage
в оба конца. Хотя аналогичный код с внутренним форматом GL_RGBA8
работает, как и ожидалось, я не могу понять, что не так с GL_RGBA8_SNORM
.
Вот код теста:
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glut.h>
void display()
{
GLuint texture;
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
const GLuint value = 0x60000000;
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8_SNORM,1,1,0,GL_RED,GL_UNSIGNED_INT,&value);
GLuint error=glGetError();
if(error!=GL_NO_ERROR)
{
printf("TexImage2D failed: %u\n",error);
exit(1);
}
GLuint returned;
glGetTexImage(GL_TEXTURE_2D,0,GL_RED,GL_UNSIGNED_INT,&returned);
error=glGetError();
if(error!=GL_NO_ERROR)
{
printf("GetTexImage failed: %u\n",error);
exit(1);
}
printf("value: %x, returned: %x\n",value,returned);
exit(0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutCreateWindow("Texture formats probe");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Я получаю этот вывод:
значение: 60000000, возвращено: 61616180
Я ожидал, что процесс преобразования будет следующим. Начальное значение 0x60000000 делится на UINT32_MAX
, чтобы получить GLfloat
значение 0,375. Затем этот результат умножается на 127, чтобы получить 47,625, что может быть округлено до 47 или 48 (в зависимости от аппаратного обеспечения). Теперь одно из этих округленных значений сохраняется в текстуре. При считывании это значение делится на 127, чтобы получить 0.370078743 или 0.377952754 (в зависимости от того, как мы округлили при сохранении текстуры). Затем это значение умножается на UINT32_MAX
, и после округления мы можем получить четыре возможных результата:
- 0x5ebd7af5,
- 0x5ebd7af6
- 0x60c18306
- 0x60c18305.
Ни один из этих четырех не равен значению, которое я получил от glGetTexImage
. Так что процесс преобразования должен быть как-то иначе.
Я тестирую GeForce GTX 750 Ti в Linux 3.12.18 x86_64 с проприетарной версией драйвера 375.39.
Так каков на самом деле процесс конвертации?