【问题标题】:Issues with the color comand in OpenGLOpenGL中颜色命令的问题
【发布时间】:2018-11-11 01:59:47
【问题描述】:
#include <GL/glut.h>
#include <stdio.h>

const int posicao=28.0;/*esta constante sera usada para fixar a posicao do inicio do texto para a funcao de escrita*/

float VERTICAL=30.0, HORIZ=30.0;

int seletor=1;

char escolha_de_magias[]={"?1-Copia de Criatura: Faz uma replica perfeita de qualquer"/* criatura contra a qual voce esteja lutando. A replica tera os mesmos poderes do orignal, mas estara sob seu controle@2-Percepcao Extra-Sensorial: Sintoniza ondas psiquicas. Isso podera ajuda-lo a ler a mente de uma criatura ou descobrir o que esta por tras de uma porta trancada. Mas este encanto pode dar informacoes equivokdas, se houver + de a font psikica perto de uma outra.@3-Fogo: Tds as criaturas tm medo d fogo, e ste enknto da o podr d fazr aparecr fogo o sua vontad. Vc pdera causr a pkena xplosao n chao q keimara pr varios os ou criar a brreira d fogo p mantr criaturas a dstancia.@4-Ouro dos Tolos: Trnsforma pdra comum em a plha do q parece sr ouro. Mas eh apnas a ilusao - embora + confiavl q o Enknto d ilusao abaixo - e a plha d ouro logo voltara a sr pdra.@5-Ilusao: Ste e  enknto podroso, mas q n e mto confiavl. Prmit criar a ilusao convncnte (pr exemplo, q o chao sta cobrto d krvao em brasa) p enganr a criatura. O enknto fikra imediatamnt sm efeito s acontcr qlqr coisa q dsfaca a ilusao (pr exemplo, vc convnc a criatura q s trnsformou em a serpnt e entao imediatamnt atnge sua kbca c  golp d spada!). e efcient sbre td c criaturas intlignts.@6-Levitacao: Vc pde lancr ste enknto sbre objtos, advrsarios ou ate sbre si msm. Fara cm q tdo q estja sob sua influencia flutue livremnt no ar, sob o seu cntrole.@7-Escudo: Cria um scudo invsivl à sua frent q o protgera d objtos fsicos, cm flechas, spadas ou criaturas. O scudo n tm efeito cntra a magia e, evdntmnte, s nd fora dle pod tokr em vc, vc tbm n podra tokr em nd fora dle.@8-Sorte: Este enknto e spcial pq pod sr lancado a qlqr momnto durante a sua avntura, a n sr durant a batalha. a vz lancado, recuperara o seu indce d SORTE em metad d seu indce d SORTE Inicial, arredondado p baixo. Ste enknto nunk lvara o seu indce d SORTE a  nmro suprior a seu nivl Inicial.@9-Habilidade: Restabelecera o seu indce d HABILIDADE. Funciona exatamnt cm o enknto d Sort.@10-Energia: Recuperara o seu indce d Energia, aumentando-o em metad d seu vlr Inicial. Funciona cmo o enknto d Sort@11-Forca: Ste enknto tm o efeito d aumentr mto a sua frca, e e mto utl qnd s luta cntra criaturas forts. Porm, dv sr utlizado c cautla, ja q e dfcil controlr a sua prpria frca qnd ela aumnta d+@12-Fraqueza: N tm efeito cntra tds as criatras, ms qnd tm, a criatra s trna fragl e mto mnos prigosa em a btalha"*/};

void escritoura (char *p)/* FUNCAO QUE ESCREVE NA TELA. Esta pronta mas sujeita a mudanças*/
{
    int contcarac=0, position=posicao, selecao=0;
    float cor[4]={ 0.0, 0.0, 0.0, 0.0};
    p++;
    glRasterPos2f(-28.0, position);
    while(*p)
    {
        if(*p=='1' || *p=='2' || *p=='3' || *p=='4' || *p=='5' || *p=='6' || *p=='7' || *p=='8' || *p=='9' || *p=='0')/* testa se eu estou olhando para um algarismo*/
        {
          /*if(*(p+1)!='1' && *(p+1)!='2' && *(p+1)!='3' && *(p+1)!='4' && *(p+1)!='5' && *(p+1)!='6' && *(p+1)!='7' && *(p+1)!='8' && *(p+1)!='9' && *(p+1)!='0')/*testa se o proximo nao e um algarismo*/
          {
            glColor3d(1.0, 0.0, 0.0);
          }
        }   
        glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *p);
        p++;
        contcarac++;
    }
    return;
}

void ABACAXI()
{
    glClearColor(1.0,1.0,1.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(HORIZ-60.0, HORIZ, VERTICAL-60.0, VERTICAL,1,100);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -5.0);

    glColor3d(0.0, 1.0, 0.0);

    glBegin(GL_LINE_STRIP);
        glVertex3d(-30.0, -30.0, 0.0);
        glVertex3d(-30.0, 30.0, 0.0);
        glVertex3d(30.0, 30.0, 0.0);
        glVertex3d(30.0, -30.0, 0.0);
    glEnd();

    escritoura(escolha_de_magias);

    glFlush();
}

void teclado(int tecla, int x, int y)
{
    switch(tecla)
    {
        case GLUT_KEY_UP:
        VERTICAL++;
        break;

        case GLUT_KEY_DOWN:
        VERTICAL--;
        break;

        case GLUT_KEY_RIGHT:
        HORIZ++;
        break;

        case GLUT_KEY_LEFT:
        HORIZ--;
        break;
    }
    glutPostRedisplay();
}

int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(1000,700);
    glutCreateWindow("Alo!");
    glutDisplayFunc(ABACAXI);
    glutSpecialFunc(teclado);
    glutPostRedisplay();
    glutMainLoop();
} 

前面的代码应该将escolha_de_magias 中的文本绘制为红色,但仍将其绘制为绿色。
在第一次调用glutBitmapCharacter() 之前,我用glGetFloatv(GET_CURRENT_COLOR, cor) 函数进行了测试,它返回绘图的颜色设置为红色。

我不知道发生了什么

【问题讨论】:

  • 您确定将颜色设置为红色的调用正在执行吗?看起来它应该对字符串中的第二个字符执行此操作,但如果不是,那么您可能希望逐步使用调试器并查看该行未执行的原因。此外,您可能应该致电glGetError() 以查看 GL 状态是否有任何问题。
  • 虽然它可能无法解决您的问题,但您应该致电 glColor3f 而不是 glColor3d。计算机图形学中很少需要双打。

标签: opengl opengl-compat


【解决方案1】:

glutBitmapCharacter 用于绘制字符的颜色由glRasterPos 设置。 glRasterPos 采用glColor 设置的当前颜色并将其关联。

您必须在glRasterPos2f 之前设置红色,才能绘制红色文字。

glColor3d(1.0, 0.0, 0.0);
glRasterPos2f(-28.0, position);

您的文本显示为绿色,因为在调用 glRasterPos2f 之前设置的最后一个颜色是 GL_LINE_STRIP 原语的颜色。

如果要绘制不同颜色的文本,则必须在文本颜色发生变化的每一点多次调用glRasterPos


当前光栅位置可以通过glGetFloatv使用参数GL_CURRENT_RASTER_POSITION得到:

float pos[4];
glGetFloatv( GL_CURRENT_RASTER_POSITION, pos );

很遗憾,您可能无法获得glRasterPos 设置的位置,因为传递给glRasterPos 的坐标由当前模型视图矩阵和投影矩阵转换,但是当您读回位置时,然后您将获得转换后的坐标,并且坐标是窗口坐标而不是标准化的设备坐标。


如果要更改关联颜色,但要保持光栅位置,则必须读取光栅当前位置glGetFloatv(GL_CURRENT_RASTER_POSITION, ...)
这将返回窗口坐标。
因此,您必须设置一个正交投影,该投影从窗口坐标转换为标准化设备坐标,然后才能再次调用 glRasterPos 以关联新颜色。模型视图矩阵必须是单位矩阵。

如下更改函数escritoura,以解决您的问题:

void escritoura (char *p)
{
    int contcarac=0, position=posicao, selecao=0;
    p++; 
    glRasterPos2f(-28.0f, position);
    while(*p)
    {
        if(*p=='1' || *p=='2' || *p=='3' || *p=='4' || *p=='5' || *p=='6' || *p=='7' || *p=='8' || *p=='9' || *p=='0')
        {
            // get the current raster position in window coordinates
            float pos[4];
            glGetFloatv( GL_CURRENT_RASTER_POSITION, pos );    

            // push model view matrix and set identity matrix
            glMatrixMode(GL_MODELVIEW);
            glPushMatrix();
            glLoadIdentity();

            // push projection matrix and set transformation form window coordinates to NDC
            glMatrixMode(GL_PROJECTION);
            glPushMatrix();
            glLoadIdentity();
            glOrtho( 0, 1000, 0, 700, -1, 1 ); // (1000, 700) is the window size!

            // change current color
            glColor3d( 1.0, 0.0, 0.0 );

            // associate new color, but keep position
            glRasterPos4fv( pos );

            // restore (pop) model view and projection matrix
            glMatrixMode(GL_PROJECTION);
            glPopMatrix();
            glMatrixMode(GL_MODELVIEW);
            glPopMatrix();
        }
        glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *p);
        p++; contcarac++;
    }
    return;
}

【讨论】:

  • @user1118321 ,是的,我是。正如我在帖子中所说,我使用 glGetFloatv 和 GET_CURRENT_COLOR 在绘制第一个字符之前获取颜色设置,如果它返回与红色对应的值,它应该在不绘制任何东西之前跳出循环,并且确实如此。
  • @SurvivalMachine,我也试过了,什么也没做。不过还是谢谢
  • 去试试,谢谢
  • 我明白了,我正在证明我如何确定颜色命令正在执行。尚未尝试您的代码,因为我仍在研究它并试图了解每个命令在做什么。但是,再一次。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多