【问题标题】:OpenGL: Limiting changes to object onlyOpenGL:仅限制对对象的更改
【发布时间】:2011-12-14 16:38:41
【问题描述】:

我正在使用 GLUT 在 openGL 中制作一个基本游戏,但遇到了一个小问题。

当我尝试从一个类中将一个对象绘制到我的世界中时,它会为所有东西赋予一种颜色,该颜色是上次使用函数 makeMaterial 创建的(见下文)。

有谁知道我如何将这些更改限制为仅应用于对象? 我试过推送/弹出,但它似乎没有任何限制。 此外,如果最后绘制的颜色是黑色,我什么都看不到,除了我的雪人。

以下是相关代码:

制作材料:-

makeMaterial( float r,float g,float b,float a,float s )  
{   
    float color[4];  
    float white[4]; 
    GLfloat surfshine[1] ; 
    surfshine[0]=s*128.0 ; 
    color[0]=r;color[1]=g;color[2]=b;color[3]=a;  
    white[0]=0.5;white[1]=0.5;white[2]=0.5;white[3]=1.0;   
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,color);  
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,color);  
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,white); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,surfshine); 
} 

makeMaterial 使用中:-

makeMaterial(0.05f,0.05f,0.05f,1.00f, 0.4f);
glPushMatrix(); 
glutSolidCube(10.0); 
glPopMatrix(); 

我的绘图功能:-

void drawToScene(void) {    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity();   
    uniformFPS.setStartTime(glutGet(GLUT_ELAPSED_TIME));

    camera.updateCamera();
    lvl1.drawLevel();
    enemy.drawSnowman(350.0f,6.0f, 200.0f);
    crosshair.show();

    glutSwapBuffers();      
    uniformFPS.enforceChecks();
}

【问题讨论】:

    标签: opengl colors rendering state glut


    【解决方案1】:

    如果您真的想确保将更改限制在特定部分,您应该能够在调用makeMaterial 之前使用glPushAttrib(GL_LIGHTING_BIT),在绘制对象之后使用glPopAttribglPushAttrib here 的参考显示了您可以提供的每个可能的位都推送了哪些属性。但是,我不知道这是处理您的状态的一种特别受欢迎的方式。

    更通用的解决方案是在每组绘图命令之前使用适当的值调用makeMaterial,即假设您的雪人只有一种材料,您的世界只有一种材料:

    //...
    makeMaterial(1.0f,1.0f,1.0f,1.0f,1.0f);
    lvl1.drawLevel();
    makeMaterial(0.5f,0.5f,0.5f,0.5f,0.5f);
    enemy.drawSnowman(350.0f,6.0f,200.0f);
    //...
    

    【讨论】:

    • 哇! push 和 pop attrib 效果很好,由于每个雪人功能各不相同,因此无法尝试第二个建议。非常感谢。
    【解决方案2】:

    当涉及到当前颜色、当前材质属性、当前线宽等属性时,OpenGL 的行为就像一个状态机。所提供的值会被保留,除非通过显式调用 setter 方法来更改它们。

    处理您的问题的正确方法是拥有所有这些属性,成为被绘制对象的属性并在渲染对象之前调用适当的方法。

    【讨论】:

    • 是的,我知道 openGL 是一个状态机,但恐怕我没有听从你的建议。你能详细说明一下吗?将不胜感激,因为我也不想将 makeMaterial 应用到世界上,因为我无法让它恢复原来的样子。
    猜你喜欢
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多