Нарисуйте цилиндр с линейной градиентной текстурой в OpenGL - PullRequest
1 голос
/ 30 июня 2011

Как я могу нарисовать цилиндр в OpenGL, который имеет текстуру с линейным градиентом, которая ориентирована так, как показано в этом примере изображения ( ссылка на изображение )?

Я использую gluCylinder (), чтобы нарисовать цилиндр. Но я изо всех сил пытаюсь получить правильную текстуру.

glEnable(GL_TEXTURE_1D);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_1D, texture);
GLubyte gradient[6] = { 255,0,0, 0,255,0 };
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, gradient);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

gluQuadricDrawStyle(quad,GLU_FILL);
gluQuadricTexture(quad,GL_TRUE);
gluCylinder(quad,1.0f,1.0f,3.0f,32,32);

Это создает градиент, но имеет неправильную ориентацию: снимок экрана

Как я могу получить правильную ориентацию?

1 Ответ

1 голос
/ 30 июня 2011

Вам необходимо указать некоторые текстурные координаты. Я не помню, какие координаты текстуры генерирует gluCylinder, если таковые вообще имеются. Но в вашем случае генерация координат старого стиля OpenGL должна вам помочь. GluCylinder идет вдоль оси Z, поэтому нам нужно отображение координат текстуры (0,0,0) → (0) в (0,0, высота) → (1).

OpenGL до версии 2 обеспечивает генерацию координат текстуры, поэтому я предлагаю добавить следующее перед вызовом gluCylinder вместо gluQuadricTexture.

GLfloat texgen_coeff[4] = {1./height, 0., 0., 0.};
glEnable(GL_TEXTURE_GEN_S);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_S, GL_OBJECT_PLANE, texgen_coeff);
...