生活随笔
收集整理的這篇文章主要介紹了
OpenGL Sharders(着色器) 入门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
著色器(Shader)是運行在GPU上的小程序。這些小程序為圖形渲染管線的某個特定部分而運行。
#version 330 core
layout
(location
= 0) in vec3 aPos
;
layout
(location
= 1) in vec3 aColor
;
out vec4 vertexColor
;
void main()
{ gl_Position
= vec4(aPos
.x
, aPos
.y
, aPos
.z
, 1.0); vertexColor
= vec4(aColor
.x
,aColor
.y
,aColor
.z
,1.0);
}
#version 330 core
out vec4 FragColor
;
uniform vec4 outColor
;
in vec4 vertexColor
;
void main()
{ FragColor
= vertexColor
;
}
詳細的著色器內容查看文檔
多元色四邊形
效果
代碼
#define GLEW_STATIC
#include<iostream>
#include<GL/glew.h>
#include<GLFW/glfw3.h>
using namespace std
;
void processInput(GLFWwindow
);
void processInput(GLFWwindow
* window
) {if (glfwGetKey(window
, GLFW_KEY_ESCAPE
) == GLFW_PRESS
) {glfwSetWindowShouldClose(window
, true);}
}
float vertices
[] {-0.5f, 0.5f, 0.0f, 1.0f, 0,0, 0.5f, -0.5f, 0.0f, 0,1.0f,0, 0.5f, 0.5f, 0.0f, 0,0,1.0f, -0.5f, -0.5f, 0.0f , 1.0f,0,1.0f
};
unsigned int indices
[] {0,1,2, 1,3,0
};
const char* vertexShaderSource
=
"#version 330 core \n"
"layout (location = 0) in vec3 aPos; \n"
"layout (location = 1) in vec3 aColor; "
"out vec4 vertexColor; \n"
"void main() \n"
"{ \n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); \n"
" vertexColor = vec4(aColor.x,aColor.y,aColor.z,1.0); \n"
"} \n";
const char* fragmentShaderSource
=
"#version 330 core \n"
"out vec4 FragColor; \n"
"uniform vec4 outColor; \n"
"in vec4 vertexColor; \n"
"void main() \n"
"{ \n"
" FragColor = vertexColor; \n"
"} \n";int main() {glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR
, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR
, 3);glfwWindowHint(GLFW_OPENGL_PROFILE
, GLFW_OPENGL_CORE_PROFILE
);GLFWwindow
* window
= glfwCreateWindow(800, 600, "Test window", NULL, NULL);if (window
== NULL) {cout
<< "open window failed." << endl
;glfwTerminate();}glfwMakeContextCurrent(window
);glewExperimental
= true;if (glewInit() != GLEW_OK
) {cout
<< "glew init failed." << endl
;glfwTerminate();return -1;}glViewport(0, 0, 800, 600);unsigned int VAO
;glGenVertexArrays(1, &VAO
);glBindVertexArray(VAO
);unsigned int VBO
; glGenBuffers(1, &VBO
);glBindBuffer(GL_ARRAY_BUFFER
, VBO
);glBufferData(GL_ARRAY_BUFFER
, sizeof(vertices
), vertices
, GL_STATIC_DRAW
);unsigned int EBO
;glGenBuffers(1, &EBO
);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER
, EBO
);glBufferData(GL_ELEMENT_ARRAY_BUFFER
, sizeof(indices
), indices
, GL_STATIC_DRAW
);unsigned int vertexShader
;vertexShader
= glCreateShader(GL_VERTEX_SHADER
);glShaderSource(vertexShader
, 1, &vertexShaderSource
, NULL);glCompileShader(vertexShader
);unsigned int fragmentShader
;fragmentShader
= glCreateShader(GL_FRAGMENT_SHADER
);glShaderSource(fragmentShader
, 1, &fragmentShaderSource
, NULL);glCompileShader(fragmentShader
);unsigned int shaderProgram
;shaderProgram
= glCreateProgram();glAttachShader(shaderProgram
, vertexShader
);glAttachShader(shaderProgram
, fragmentShader
);glLinkProgram(shaderProgram
);glVertexAttribPointer(0, 3, GL_FLOAT
, GL_FALSE
, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT
, GL_FALSE
, 6 * sizeof(float), (void*)(3*sizeof(float)));glEnableVertexAttribArray(1);while (!glfwWindowShouldClose(window
)) {processInput(window
);glClearColor(0.2, 0.3, 0.3, 1.0);glClear(GL_COLOR_BUFFER_BIT
);glBindVertexArray(VAO
);glUseProgram(shaderProgram
);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER
, EBO
);glDrawElements(GL_TRIANGLES
, 6, GL_UNSIGNED_INT
, 0);glBindVertexArray(0);glfwSwapBuffers(window
);glfwPollEvents();}glfwTerminate();return 0;
}
uniform
Uniform是一種從CPU中的應用向GPU中的著色器發送數據的方式,但uniform和頂點屬性有些不同。首先,uniform是全局的(Global)。全局意味著uniform變量必須在每個著色器程序對象中都是獨一無二的,而且它可以被著色器程序的任意著色器在任意階段訪問。第二,無論你把uniform值設置成什么,uniform會一直保存它們的數據,直到它們被重置或更新。
下面是使用uniform向著色器賦值
float timeValue
= glfwGetTime();
float greenValue
= (sin(timeValue
) / 2.0f) + 0.5f;
int vertexColorlocation
= glGetUniformLocation(shaderProgram
, "outColor");
glUseProgram(shaderProgram
);
glUniform4f(vertexColorlocation
, 0, greenValue
, 0, 1.0f);
總結
以上是生活随笔為你收集整理的OpenGL Sharders(着色器) 入门的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。