簡體   English   中英

OpenGL工作着色器?

[英]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_BYTEGL_UNSIGNED_BYTEGL_SHORTGL_UNSIGNED_SHORTGL_INTGL_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的必須從改變vec2ivec2因為坐標的數據類型是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)和右下側( widthheight ):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM