Точка, нарисованная поверх текстуры, не получает желаемый цвет

Важный: Я должен работать с фиксированный трубопровод (У меня нет голоса в этом вопросе).

Я должен изменить некоторые существующие OpenGL код (средство просмотра панорамных изображений, в котором панорама разделена на шесть граней куба), поэтому мы можем рисовать линии / точки поверх загруженных текстур, где точки — это координаты мыши, не проецируемые на координаты объекта.

Я написал тестовую программу с цветным кубом, чтобы попробовать нарисовать линию поверх него:

Тестовая программа

Я получил это с помощью кода, нажав GL_DEPTH_BUFFER_BIT Атрибут для стека, отключив его до рисования точек и вставив атрибут стека после того, как я закончил рисовать.

Я пытался использовать тот же подход в существующем приложении, но я получил следующие результаты (здесь я пытаюсь только нарисовать точку):

Точка над текстурой, 1

Точка над текстурой, 2

Я уточнил красный как цвет для точки, но, как вы можете видеть, он не имеет желаемого. Я подумал, что это может быть из-за смешивания и что он может смешивать свой цвет с базовой текстурой, поэтому я нажал GL_BLEND Присвойте стеку и отключите его перед рисованием, но точка все равно не получает желаемый цвет.

Что здесь происходит? Есть ли способ «заставить» конвейер закрасить точку красным?

initCube (): это вызов перед обновлением сцены GL.

 void panoViewer::initCube() {
makeCurrent();
if(texture){
glDisable( texture );
textName = 0;
texture = 0;
}

glDisable( GL_TEXTURE_GEN_S );
glDisable( GL_TEXTURE_GEN_T );
glDisable( GL_TEXTURE_GEN_R );

glFrontFace( GL_CCW );
glEnableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

texture = GL_TEXTURE_CUBE_MAP;
textName = texnms[1];
glEnableClientState(GL_NORMAL_ARRAY);
glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
glTexGenf( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
glEnable( GL_TEXTURE_GEN_S );
glEnable( GL_TEXTURE_GEN_T );
glEnable( GL_TEXTURE_GEN_R );

// Add the textures to the cube faces.
// ...
}

initializeGL ():

 void panoViewer::initializeGL() {
qglClearColor(Qt::black);
glShadeModel(GL_SMOOTH);
glEnable(GL_CULL_FACE);
glEnable( GL_DEPTH_TEST );

// create texture objects
glGenTextures( 1, textName );
glBindTexture( GL_TEXTURE_CUBE_MAP, textName );

// find the largest feasible textures
maxTex2Dsqr = maxTexSize( GL_PROXY_TEXTURE_2D, max2d, max2d );
maxTex2Drec = maxTexSize( GL_PROXY_TEXTURE_2D, max2d, max2d / 2 );
maxTexCube = maxTexSize( GL_PROXY_TEXTURE_CUBE_MAP, maxcube, maxcube );

// constant texture mapping parameters...
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
// for cube maps...
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

// enable alpha blending for overlay
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glDisable(GL_LIGHTING);

// Create display list: dispList
// ...
}

paintGL ():

 void panoViewer::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if(texture) {
glBindTexture(texture, textName);
glEnable( texture );
}

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glRotated( 180, 0, 1, 0 );   // camera looks at the front of the van
glRotated( 180, 0, 0, 1 );   // van's roof points to the sky

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//    double hFOV, vFOV;    // angular size at sphere center (deg)
//    double minFOV, maxFOV; // limits on vFOV
//    double wFOV;  // vert angle at eye (deg) sets magnification

double  hhnear = Znear * tan( 0.5 * RAD(wFOV) ),
hwnear = hhnear * aspectRatio,
dxnear = 2 * hwnear * fcompx,
dynear = 2 * hhnear * fcompy;

glFrustum( -(hwnear + dxnear), hwnear - dxnear,
-(hhnear + dynear), hhnear - dynear,
Znear, Zfar
);
glRotated( 180, 0, 1, 0 );
glTranslated( eyex, eyey, eyez );

glRotated( tiltAngle, 1, 0, 0 );
glRotated( panAngle, 0, 1, 0 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glCallList(dispList);

glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST);

// Paint the point in red
// ...
glPopAttrib();
}

ОБНОВИТЬ: Я забыл упомянуть, что код основан на Qt, Он использует QtOpenGL Модуль экстенсивно.

ОБНОВЛЕНИЕ № 2: Я добавил немного кода.

-1

Решение

В конвейере с фиксированной функцией существует много состояний, которые могут привести к тому, что цвет вершины будет полностью игнорироваться.

Как отметил Рето Коради в комментариях, при включенном освещении цвета не действуют (если GL_COLOR_MATERIAL включается, и в этом случае значение цвета используется для обновления параметров материала, используемых для уравнения освещения.)

Как я указал в комментариях, другой случай — текстурирование. В зависимости от GL_TEX_ENV_MODE выбранный цвет фрагмента (как определено по освещению или непосредственно интерполирован из цветов вершин) модулируется цветом текстуры или полностью заменяется. В этом случае отключение текстурирования для каждого используемого текстурного блока может решить эту проблему.

1

Другие решения


По вопросам рекламы [email protected]