【问题标题】:How to rotate image primitive? I have tried to use glRotatef function, but it does not get result如何旋转图像图元?我尝试使用 glRotatef 函数,但没有得到结果
【发布时间】:2014-01-15 15:05:20
【问题描述】:

此代码必须绘制两条正弦线。这里两条常用线通过着色器转换为正弦线。我有一个任务要旋转其中一个(例如,旋转 45 度或 90 度),怎么做?

void CMyApplication::OnDraw()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgramObjectARB(m_program);

    glUniform1fARB(m_amplitudeUniformLocation, 0.3f);
    glUniform1fARB(m_phaseUniformLocation, m_phase);
    glUniform1fARB(m_frequencyUniformLocation, M_PI);
    glUniform1fARB(m_colourUniformLocation, 0.0f);
    //glUniform1fARB(m_rotateUniformLocation, true);
    //glLoadIdentity();
    //glRotatef(90.0f, 0.0f, 0.0f, 0.0f);
    glBegin(GL_LINE_STRIP);
    {
        for (float x = -1; x <= 1.05; x += 0.01)
        {
            glVertex3f(x, 0, 0);
            glColor3f(0, 0.5, -0.8);
        }
    }
    glEnd();
    //glLoadIdentity();
    //glRotatef(-90.0f, 0.0f, 0.0f, 0.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glUniform1fARB(m_phaseUniformLocation, m_phase - 0.5);
    glUniform1fARB(m_colourUniformLocation, 0.5f);
    //glUniform1fARB(m_rotateUniformLocation, false);

    glBegin(GL_LINE_STRIP);
    {
        for (float x = -1; x <= 1.05; x += 0.01)
        {
            glVertex3f(x, -0.5, 0);
            glColor3f(0, -0.5, 0.8);
        }
    }
    glEnd();

    __glewMatrixRotatefEXT(GL_MODELVIEW, 45, 0, 0, 1); //THIS STRING HAS BEEN RESOLVED         //MY PROBLEM

    glUseProgramObjectARB(NULL);

    glutSwapBuffers();
}

下面的着色器:

uniform float phase;                
uniform float amplitude;            
uniform float frequency;                           
void main()                     
{                                   
    vec4 v = gl_Vertex;                                 
    v.y += amplitude * sin(frequency * v.x + phase);    
    gl_Position = gl_ModelViewProjectionMatrix * v;     
    gl_FrontColor = gl_Color;       
 }

【问题讨论】:

  • 圣洁ARB_shader_objects蝙蝠侠!
  • 您应该在包含着色器的SSCCE 中进行编辑。
  • 不向我们展示着色器就无法回答您的问题。
  • @user3164957:您可能没有意识到这一点,但glMatrixRotatefEXT (...) 是名为GL_EXT_direct_state_access 的扩展程序的一部分。只有 NV 和 AMD 在 2008 年之后发布的驱动程序才能真正实现此扩展。如果您尝试编写支持非常旧的 驱动程序的代码路径(正如您使用GL_ARB_shader_objects 所暗示的那样),最好远离此扩展。
  • glMatrixRotatefEXT (...) 在此示例中为您做的唯一一件事是允许您在不将矩阵模式设置为 GL_MODELVIEW 的情况下旋转 ModelView 矩阵。这是完全多余的,因为在调用它之前只有几行,您已经将矩阵模式设置为模型视图。您可以使用glRotatef 代替它。

标签: opengl shader glut glrotate


【解决方案1】:

因为您正在使用着色器,所以 glRotatef 将无法按预期运行。一旦使用着色器启用可编程管线,固定功能管线转换调用将被关闭。所以本质上,glRotatef 在这里什么都不做,除非您已经在顶点着色器中使用了正确的矩阵。

要获得您正在寻找的结果,您需要生成适当的旋转矩阵,将其传递给统一变量中的顶点着色器,然后在应用 WVP 变换之前将其乘以您创建的线。最终结果应该给你旋转的线。

【讨论】:

  • glRotatef (...) 没有“关闭”。假设您有一个矩阵堆栈仍然存在的上下文(例如,不是 3.2+ 核心),它仍然将当前矩阵乘以旋转矩阵。事实上,由于这段代码使用了 GLSL 的古老 ARB 扩展,您甚至可以使用 gl_ModelViewProjectionMatrix 等从 GLSL 中访问固定函数矩阵。核心配置文件不支持这一点,这可能是您困惑的根源。
  • 我应该注意到,最初的问题没有包括在顶点着色器中适当使用 gl_ModelViewProjectionMatrix,而是暗示除了简单地调用 glRotatef 之外没有做任何事情,如果着色器需要额外的努力没有写正确。我已经更新了我的答案以反映这一点,但它仍然是一个带有一些警告的通用答案。这可能是我困惑的真正根源。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多