【发布时间】: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