近階段簡單的學習了GLSL,對於很多新手,可能主要就是GLSL中shader與opengl之間的變數傳遞問題存在障礙,下面把學習的筆記曬一曬,希望能協助大家。
剛開始寫部落格,歡迎大家提意見和拍磚!
輸出類型:
vertex shader :gl_Position
Fragment shader :gl_FragColor gl_FragDepth
1、屬性資料 attribute 頂點屬性,向vertex shader中傳遞
1、預設內建屬性資料 gl_Color gl_Normal gl_Vertex gl_TextCoord,這些頂點屬性由opengl程式向shader中發送
在vertex shader中可以直接調用gl_Color這樣的寫法
2、自訂屬性
//attribute
int my_vec3_location = glGetAttribLocationARB(my_program,“my_3d_vector”);//定義一個my_3d_vector的量,每 個頂點設定它的值
glBegin(GL_TRIANGLES);
glVertexAttrib3f(my_vec3_location, 4.0f, 2.0f, 7.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertexAttrib3f(my_vec3_location, 2.0f, 9.0f, 2.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertexAttrib3f(my_vec3_location, 1.0f, 0.0f, 5.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glEnd();
在vertex shader中:
attribute vec3 my_3d_vector;//這樣就能接受到了
2、一致變數 Uniform 提供相對不變的參量,Opengl向vertex shader或Fragment shader傳遞資料,在shader中是唯讀
Uniform 使用:
1、在application中聲明
GLint my_color;
my_color = glGetUniformLocation(p,"define_color");//p是glCreateProgram()建立的,define_color是變數名稱
glUniform4f(my_color, 0.0,1.0,0.0,0.0);
2、在shader中
uniform vec4 define_color;//聲明
void main()
{
gl_FragColor= define_color;//使用
}
3、易變變數 varying 由vertex shader向Fragment shader中傳遞資料
varying vec4 ambient;//vertex shader中聲明,具體操作
varying vec4 ambient;//Fragment shader中聲明,可以使用