2014-01-15 33 views
0

此代碼必須繪製兩條竇線。這裏通過着色器將兩條通常的線轉換成竇形線。我有一項任務需要旋轉其中的一個(例如45或90度),該怎麼做?下面如何旋轉圖像原始?我試圖使用glRotatef函數,但它沒有得到結果

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;  
} 
+0

Holy ['ARB_shader_objects'](http://www.opengl.org/registry/specs/ARB/shader_objects.txt)蝙蝠俠! – genpfault

+1

您應該在包含着色器的[SSCCE](http://sscce.org/)中進行編輯。 – genpfault

+0

OK.Is是否有任何功能來旋轉圖像?我試圖旋轉它,發送到着色glRotate函數,但編譯文件。看起來,這個函數與着色器語言不匹配 –

回答

0

由於您使用的着色器,glRotatef也不會達到預期的功能。一旦使用着色器啓用了可編程流水線,固定功能流水線轉換調用就會關閉。因此,本質上,除非您已經在頂點着色器中使用了正確的矩陣,否則glRotatef在此不做任何事情。

爲了達到您要查找的結果,您需要生成適當的旋轉矩陣,將其傳遞到頂點着色器中的統一變量,然後在應用WVP變換之前將其乘上創建的行。最終結果應該給你旋轉的線。

+2

'glRotatef(...)'不是「關閉」。假設您有一個矩陣堆棧依然存在的上下文(例如,不是3.2+核心),它仍然將當前矩陣乘以一個旋轉矩陣。實際上,由於此代碼使用古老的ARB擴展GLSL,您甚至可以使用'gl_ModelViewProjectionMatrix'等來訪問GLSL中的固定功能矩陣等。核心配置文件不支持這一點,這可能是您混淆的根源。 –

+0

我應該注意,原始問題沒有包括在頂點着色器中正確使用gl_ModelViewProjectionMatrix,而是暗示除了簡單地調用glRotatef之外沒有其他任何操作,除非僅僅調用glRotatef,否則如果着色器寫入不正確,則需要額外的工作量。我已經更新了我的答案以反映這一點,但它仍然是一個廣義的答案,有一些注意事項。這可能是我混亂的真正根源。 – mbillock

相關問題