OpenGL中的Shader
http://blog.csdn.net/huangcanjun187/article/details/52474365
學習總結自:http://learnopengl.com/#!Getting-started/Hello-Triangle?
http://learnopengl.com/#!Getting-started/Shaders?
繼上篇文章中提到,OpenGL是為了在GPU上同時跑成千上萬個程序,在GPU上跑的這些小程序,稱為Shader。
準備
我們在運行GPU程序前,得準備幾樣東西:1)輸入數據。2)數據緩沖區。3)Shader程序。4)GLSL(OpenGL Shade Language)主程序。?
以畫一個三角形為例,?
1)輸入數據包括:a. 三點頂點的坐標。b. 三個頂點的顏色。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
2)數據緩存區包括:a. 數據怎么識別。哪一塊是坐標數據?哪一塊是顏色數據? b. 哪一塊數據是第一個三角形的數據?哪一塊數據是第二個三角形的數據?
GLuint VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);// 首先綁定VAO結構。一個VAO對應一個形狀對象,包含了一個形狀的所有屬性,包括顏色、坐標等等。用shader程序調用VAO這個結構,可以畫出對應的圖像來。 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//在綁定VAO之后,綁定VBO結構。**這樣VBO就屬于之前被綁定VAO的一部分。**里面包含了預先定義好的數組vertices,vertices就是一個浮點數組,包含具體的坐標、顏色值。 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0);// 坐標屬性。讓Vertex Shader將這部分數據作為坐標導入。 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(1);// 顏色屬性。讓Vertex Shader將這部分數據作為坐標顏色值導入。 glBindVertexArray(0); // Unbind VAO- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3)Shader 程序。將導入GPU的數據,為對應的坐標點畫上對應的顏色。
// Shaders const GLchar* vertexShaderSource = "#version 330 core\n""layout (location = 0) in vec3 position;\n"//location = 0,與之前綁定VAO步驟中的函數glEnableVertexAttribArray(0)對應,把坐標數據導入到 vec3 position 這個shader中的坐標變量。 "layout (location = 1) in vec3 color;\n"//location = 1,與之前綁定VAO步驟中的函數glEnableVertexAttribArray(1)對應,把坐標數據導入到 vec3 color這個shader中的顏色變量。 "out vec3 ourColor;\n" "void main()\n" "{\n" "gl_Position = vec4(position, 1.0);\n" "ourColor = color;\n"//將顏色值直接賦值給輸出的變量ourColor,在Fragment Shader中也有一個同名的變量,所有最終像素的顏色就是此顏色值。 "}\0"; const GLchar* fragmentShaderSource = "#version 330 core\n" "in vec3 ourColor;\n" //OpenGL Shader程序會直接將同名的變量聯系到一起,這個ourColor就是vertex shader中的輸出的ourColor "out vec4 color;\n" "void main()\n" "{\n" "color = vec4(ourColor, 1.0f);\n" "}\n\0";- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
4)GLSL 主程序
GLuint shaderProgram = glCreateProgram(); //創建一個GLSL主程序glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);//將兩個shader掛載到主程序上glLinkProgram(shaderProgram);//鏈接shader程序。編譯shader的步驟在此之前。接下來會詳細介紹- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
步驟
為何要將1)輸入數據。2)數據緩沖區。3)Shader程序。4)GLSL(OpenGL Shade Language)主程序。這個幾個模塊分開介紹呢??
因為這幾塊相互獨立,這是OpenGL比較明顯的特點。詳細說,就是GLSL主程序可以鏈接任意一個編譯好的shader程序,編譯好的shader程序可以裝載不同的VAO(Vertext Array Object,它是VBO的老大,Shader 調用的時候是直接調VAO,VBO包含了數據,VAO包含了VBO以及如何讓Shader識別這些VBO數據的一些屬性),VAO又可以用不同的方式裝載不同的數據。?
以這段代碼為例,只粘貼了比較關鍵的代碼,完整源碼請參考:?
http://learnopengl.com/code_viewer.php?code=getting-started/shaders-interpolated?
程序的結果就是對三角形的三個頂點畫上紅、綠、藍三種顏色,三角形中間區域的顏色OpenGL會自動插值出來,這是OpenGL的神奇之處(我也還沒懂原理)。?
轉載于:https://www.cnblogs.com/jukan/p/6999890.html
總結
以上是生活随笔為你收集整理的OpenGL中的Shader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 展位位置选择(关于展位的介绍)
- 下一篇: JAVA编程规范-常量定义