[英]OpenGL work shader?
有兩個着色器,頂點着色器和片段着色器
const char *vShaderstr =
"#version 300 es\n"
"layout(location = 0) in vec4 a_color;\n"
"layout(location = 1) in vec2 a_position;\n"
"out vec4 v_color;\n"
"void main()\n"
"{\n"
" v_color = a_color;\n"
" gl_Position.xy = a_position;\n"
" gl_Position.z = 0.0;\n"
" gl_Position.w = 1.0;\n"
"}";
const char *fShaderstr =
"#version 300 es\n"
"precision lowp float;\n"
"in vec4 v_color;\n"
"out vec4 o_fragColor;\n"
"void main()\n"
"{\n"
" o_fragColor = v_color;\n"
"}";
問題是我沒有浮點數的顏色,但沒有字節的顏色。 並且位置int,而不是float。 和vec,就像我在浮標中浮出水面一樣。 要將數據發送到管道,我使用此類命令。
glVertexAttribPointer ( 0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, pixels );
glVertexAttribPointer ( 1, 2, GL_INT, GL_FALSE, 0, vertices );
glEnableVertexAttribArray ( 0 );
glEnableVertexAttribArray ( 1 );
glDrawArrays ( GL_POINTS, 0, max_draw );
字節中的像素。 int的頂點。
有關OpneGL ES glVertexAttribPointer
請參閱Khronos組參考頁:
對於
glVertexAttribPointer
,如果將normalized設置為GL_TRUE
,則表示以整數格式存儲的值在它們被映射到[-1,1](對於有符號值)或[0,1](對於無符號值)時會被映射。被訪問並轉換為浮點數。 否則,值將被直接轉換為浮點數而不進行標准化。對於
glVertexAttribIPointer
,僅接受整數類型GL_BYTE
,GL_UNSIGNED_BYTE
,GL_SHORT
,GL_UNSIGNED_SHORT
,GL_INT
,GL_UNSIGNED_INT
。 值始終保留為整數值。
您必須將RGB顏色的顏色通道從[0,255]轉換為[0.0,1.0]。 因此,您必須使用:
// normalized = GL_TRUE: [0, 255] -> [0.0, 1.0]
glVertexAttribPointer( 0, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, pixels );
但是您想按原樣使用頂點坐標作為整數坐標。 因此,您必須使用glVertexAttribIPointer
(關注I
):
// glVertexAttribIPointer because of integer coordinates
glVertexAttribIPointer( 1, 2, GL_INT, 0, vertices );
類型在頂點着色器頂點attribue的必須從改變vec2
到ivec2
因為坐標的數據類型是GL_INT
:
#version 300 es
layout(location = 0) in vec4 a_color;
layout(location = 1) in ivec2 a_position; // <---- ivec2
out vec4 v_color;
uniform mat4 u_projection;
void main()
{
v_color = a_color;
vec2 p = vec2(a_position); // <---- convert from int to float
gl_Position = u_projection * vec4( p.xy, 0.0, 1.0 );
}
還要注意, gl_Position
是通過除以w
分量而轉換為歸一化設備坐標(NDC)的剪輯空間坐標。 在規范化的設備空間中,左下角為(-1.0,-1.0),右上角為(1.0,1.0)。 然后將規范化的設備坐標線性映射到窗口坐標(由glViewport
設置的視口)。
您必須設置一個投影矩陣,該矩陣將頂點坐標轉換為剪輯空間(最后是規范化的設備空間)。
下面的示例設置的正投影矩陣,突出屏幕空間坐標,其中左上角為(0,0)和右下側( width
, height
):
GLuint shader_prog = .... ; // shader program object
float width = .... ; // viewport width in pixel
float height = .... ; // viewport height in pixel
float prj_mat[] =
{
2.0f/width, 0.0f, 0.0f, 0.0f,
0.0f, -2.0f/height, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f, 1.0f
};
glLinkProgram( shader_prog );
GLint prj_loc = glGetUniformLocation( shader_prog, "u_projection" );
glUseProgram( shader_prog );
glUniformMatrix4fv( prj_loc, 1, GL_FALSE, prj_mat );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.