首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在片段/顶点着色器的同时使用固定的glEnable(GL_LIGHTING)吗?

我可以在片段/顶点着色器的同时使用固定的glEnable(GL_LIGHTING)吗?
EN

Stack Overflow用户
提问于 2011-07-26 22:33:52
回答 1查看 1.3K关注 0票数 2

我浏览了许多在线文章,添加光照似乎非常简单,但我无法得到结果。我使用的是OpenGL 3.0,我为我的动画模型使用了顶点和片段着色器。顺便说一句,我是OpenGL的新手。

抛开灯光不谈,我让3D char在环境中运行得很好。

代码语言:javascript
复制
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    *snip*

    glEnable(GL_LIGHTING);
    glEnable (GL_LIGHT0);

    float ambientLight0[] = { 0.2f, 0.2f, 0.2f, 1.0f };
    float diffuseLight0[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    float specularLight0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
    float position0[] = { -2.5f, 1.0f, -1.0f, 1.0f };   
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight0);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0);
    glLightfv(GL_LIGHT0, GL_POSITION, position0);

    //glEnable(GL_COLOR_MATERIAL);
    //float mcolor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    //glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mcolor);

    m_Beast.onRender();

下面是m_Beast.onRender()的外观:

代码语言:javascript
复制
    glPushMatrix();

    Vector3 pos = getPosition();
    glTranslatef(pos.x, pos.y, pos.z);

    glBindTexture(GL_TEXTURE_2D, m_beastTextureID);

    static float modelviewMatrix[16];
    static float projectionMatrix[16];

    glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMatrix);
    glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix);

    m_shaderProgram->bindShader();
    m_shaderProgram->sendUniform4x4("modelview_matrix", modelviewMatrix);
    m_shaderProgram->sendUniform4x4("projection_matrix", projectionMatrix);
    m_shaderProgram->sendUniformTexture("texture0", 0);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
    glVertexAttribPointer((GLint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
    glVertexAttribPointer((GLint)1, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, m_interpolatedFrame.vertices.size());

    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);

    glPopMatrix();

我只是想要一个快速的方法来获得我的模型上的一些平行光。在这一点上,我真的对编写光照着色器不感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-26 22:40:05

一旦使用顶点着色器,就必须自己实现照明计算。在旧的OpenGL中,人们仍然可以使用固定的函数顶点流水线,并且只对片段阶段进行编程。但是对于OpenGL-3和更高版本,您需要完成所有这些操作。

然而,你不应该对此感到太糟糕。最后,你会写得更少,因为配置固定函数所需的大量函数调用可以被更短、更简洁的着色器代码所取代。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6831701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档