簡介
GLSL(OpenGL Shading Language)是一種用于描述頂點和片元著色器的語言。它是一種 C 語言的變體,專門為 OpenGL 和其他著色器渲染系統(tǒng)而設計。
在渲染圖形時,主程序會將頂點數(shù)據(jù)發(fā)送到 GPU,然后 GPU 會使用圖形著色器來計算每個像素的最終顏色。圖形著色器的輸入是頂點數(shù)據(jù),輸出是像素顏色。
著色器代碼和主程序之間的關系就在于著色器代碼是在GPU上執(zhí)行的,主程序是在CPU上執(zhí)行的。主程序會把數(shù)據(jù)傳給著色器,例如頂點數(shù)據(jù),著色器代碼就能夠處理這些數(shù)據(jù),并將結果返回給主程序。
GLSL 著色器分為兩類:
頂點著色器:處理圖形中每個頂點的位置。
片元著色器:處理每個像素的顏色和透明度。
GLSL 著色器代碼通常包含一個或多個函數(shù),每個函數(shù)都有一個特定的輸入和輸出。例如,頂點著色器的主函數(shù)通常名為 main,它接受一個位置向量作為輸入,并返回一個處理后的位置向量作為輸出。
#version 330 core
in vec3 aPos;
void main()
{
gl_Position = vec4(aPos, 1.0);
}
在這個例子中,我們定義了一個輸入變量 aPos,它是一個三維向量。在函數(shù)體中,我們將 aPos 賦值給了內建變量 gl_Position。gl_Position 是一個四維向量(把它變成了齊次坐標,方便旋轉平移縮放),它表示當前頂點的位置。
你可以使用 GLSL 編寫自己的著色器代碼,然后將其編譯并附加到你的圖形程序中。通常,你需要創(chuàng)建一個頂點著色器和一個片元著色器,然后將它們附加到一個圖形程序中。例如,在 OpenGL 中,你可以使用以下代碼來加載著色器(記得封裝):
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
// 加載著色器源代碼
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
// 編譯著色器
glCompileShader(vertexShader);
glCompileShader(fragmentShader);
// 創(chuàng)建圖形程序
GLuint shaderProgram = glCreateProgram();
// 附加著色器到圖形程序
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
// 鏈接圖形程序
glLinkProgram(shaderProgram);
// 刪除著色器,因為它們已經(jīng)附加到圖形程序中
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
如何在程序中使用 GLSL 著色器
首先,你需要在你的圖形程序中設置頂點屬性。例如,如果你的頂點著色器有一個名為 aPos 的輸入變量,那么你就需要在你的程序中設置對應的頂點屬性。你可以使用以下代碼來設置頂點屬性:
GLint posAttrib = glGetAttribLocation(shaderProgram, "aPos");
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(posAttrib);
在這個例子中,我們首先調用 glGetAttribLocation 函數(shù)來獲取 aPos 變量的位置。然后,我們使用 glVertexAttribPointer 函數(shù)來設置頂點屬性,并使用 glEnableVertexAttribArray 函數(shù)來啟用頂點屬性。
接著,你可以使用以下代碼來使用你的著色器繪制圖形:
glUseProgram(shaderProgram);
glDrawArrays(GL_TRIANGLES, 0, 3);
在這個例子中,我們首先調用 glUseProgram 函數(shù)來使用圖形程序。然后,我們調用 glDrawArrays 函數(shù)來繪制。
更詳細的著色器示例:
頂點著色器可能會類似于這樣:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
ourColor = aColor;
}
頂點著色器接受頂點屬性 aPos 和 aColor,并將其轉換為世界空間中的位置。gl_Position并不是out變量,因此直接輸出,而out變量ourcolor的功能:將每個頂點的顏色從頂點著色器傳遞到片段著色器中。
而片段著色器類似于下面這樣:
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
void main()
{
FragColor = vec4(ourColor, 1.0);
}
片段著色器接受來自頂點著色器的顏色,并將其傳遞給輸出顏色。這樣,每個像素都會有一種顏色,并且圖形就會顯示出來。
主程序還可以使用變量和常量(稱為 uniform 變量)來與著色器代碼進行交互。例如,在上面的著色器代碼中,主程序可以將 model, view, projection 的矩陣傳遞給頂點著色器以計算每個頂點的世界空間位置。文章來源:http://www.zghlxwxcb.cn/news/detail-428413.html
好,同學們加油文章來源地址http://www.zghlxwxcb.cn/news/detail-428413.html
到了這里,關于GLSL基礎概念(絕對看得懂)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!