我可以在著色器中使用 glColor3f()、glVertex3f() 或其他 API 函式嗎?我寫了一個著色器來繪制彩色立方體,效果很好。我的頂點著色器和片段著色器看起來像這樣
#vertext shader
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
out vec4 vertexColor;
void main()
{
gl_Position = proj * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertexColor = vec4(aColor, 1.0);
};
#fragment shader
#version 330 core
in vec4 vertexColor;
out vec4 FragColor;
void main(){
FragColor = vertexColor;
};
不,我嘗試將 gl 函式與我的彩色立方體一起使用。假設我有一些這樣的繪圖代碼。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, -1, 0, 0, 0, 0, 1, 0);
glColor3f(1.0, 0.0, 0.0);
glLineWidth(3);
glBegin(GL_LINES);
glVertex3f(-1, -1, 0);
glVertex3f(1, 1, 0);
因為我使用 glUseProgram() 來使用我自己的著色器。上面的 gl 函式似乎沒有按預期作業(坐標和顏色都錯誤)。glVertex3f() 之類的函式如何將頂點傳遞給著色器?當使用 gl 函式繪制時,著色器應該是什么樣子的?
uj5u.com熱心網友回復:
我可以在著色器中使用 glColor3f()、glVertex3f() 或其他 API 函式嗎?
是的你可以。
但是,您需要使用兼容性組態檔OpenGL 背景關系,并且您只能使用 GLSL 1.20 頂點著色器和頂點著色器內置屬性(例如gl_Vertex,gl_Color)。您可以將 GLSL 1.20 頂點著色器與片段著色器結合使用。固定函式矩陣堆疊中的矩陣可以使用內置制服訪問,例如gl_ModelViewProjectionMatrix.
所有屬性和統一都在OpenGL 著色語言 1.20 規范中詳細說明。
合適的頂點著色器如下所示:
#version 120
varying vec4 vertexColor;
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vertexColor = gl_Color;
};
#version 330
in vec4 vertexColor;
out vec4 FragColor;
void main(){
FragColor = vertexColor;
};
uj5u.com熱心網友回復:
的glBegin()/glEnd()偽指令在OpenGL的相容性分布用作相對于芯輪廓,其是更現代的。但是,您正在使用該行在核心組態檔中編譯著色器#version 330 core。
即使著色器不能在核心組態檔編譯的,我不認為他們會作業,因為我相信你無法通過與位置索引(頂點屬性aPos,aColor使用)glVertex3f。
我建議使用核心 Opengl 進行渲染呼叫。這意味著你不應該使用你glBegin()......glEnd()并在每個渲染周期中傳遞頂點坐標。相反,立方體事先與 GPU 協調,讓您的著色器訪問這些值:
- 使用
glGenBuffers(). - 使用 將頂點資料存盤在緩沖區中
glBufferData()。 - 從緩沖區中提取
aPos和aColor屬性,并使用 分別為它們分配索引 0 和 1glVertexAttribPointer()。
這應該可以作業,并且不需要更改您的著色器代碼。
編輯:
為了在兼容性組態檔中渲染,glBegin/ 中提供的資料glEnd通過默認著色器管道運行。您無法使用顯式著色器代碼自定義管道(就像您現在所做的那樣),但您可以修改管道中的一些基本內容(例如顏色、phong 照明、紋理)。因此,如果您想獲得著色器代碼表示的結果,則需要執行以下操作:
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-1.0f,-0.25f,0.0f); //First vertex
glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-0.5f,-0.25f,0.0f); // Second vertex
...
glEnd();
這種在渲染呼叫期間發送完整物件詳細資訊的方式稱為立即模式。要添加照明,您需要glEnable(GL_LIGHTING)為每個頂點和一堆其他東西添加法線資訊。
如果使用核心組態檔,則可以定義自己的著色器,但不能在渲染呼叫期間使用立即模式。您需要在渲染回圈之前傳遞頂點資料。基本上glBegin,glEnd核心組態檔不支持 ,'glVertex3f' 并且您需要使用上面的 3 點在渲染任何內容之前將資料存盤在圖形設備中(這是使用 完成的glDrawArrays())。本教程很好地介紹了這些概念,可以幫助您使用核心輪廓繪制所需的立方體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386148.html
標籤:C opengl GLSL 着色器 opengl-compat
