首页 > 社交 > 科普中国

OpenGL

常驻编辑 科普中国 2022-09-30 连贯   角形   纹理   顶点   绑定   变量   直线   片段   图像   窗口   梦想
TrX拜客生活常识网

index:绑定顶点着色器里的第几个属性TrX拜客生活常识网

TrX拜客生活常识网

size:一个顶点所有数据的个数,这里每个顶点包含了xyz三个浮点数所以是3TrX拜客生活常识网

type:顶点描述数据的类型,这里position数组中的数据全部为float,所以是GL_FLOATTrX拜客生活常识网

normalized:是否需要显卡帮忙把数据归一化到-1到+1区间,这里不需要,所以设置GL_FALSETrX拜客生活常识网

stride:一个顶点到下一个顶点的字节数,这里为3+3个元素(顶点xyz+纹理xyz)两个float,所以是sizeof(float)*6TrX拜客生活常识网

pointer:顶点数组中第一个元素的指针TrX拜客生活常识网

glEnableVertexAttribArrayTrX拜客生活常识网

我们能声明的顶点属性是有上限的,它一般由硬件来决定。OpenGL确保至少有16个包含4分量的顶点属性可用,但是有些硬件或许允许更多的顶点属性,你可以查询glGetIntegerv(GL_MAX_VERTEX_ATTRIBS,&n); 来获取具体的上限。默认情况下,出于性能考虑,所有顶点着色器的属性(Attribute)变量都是关闭的,所以需要通过glEnableVertexAttribArray来打开。TrX拜客生活常识网


TrX拜客生活常识网

4.4.3 构建纹理数据

//传纹理的像素格式给fragment shader
GLint yuvType = glGetUniformLocation(m_programId, "yuvType");
glUniform1i(0, yuvType);

GLint samplerY = glGetUniformLocation(m_programId, "SamplerY");
GLint samplerU = glGetUniformLocation(m_programId, "SamplerU");
GLint samplerV = glGetUniformLocation(m_programId, "SamplerV");
glUniform1i(samplerY, 0);
glUniform1i(samplerU, 1);
glUniform1i(samplerV, 2);



glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,m_textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frame->width, frame->height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, frame->data[0]);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_textures[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frame->width/2, frame->height/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, frame->data[1]);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, m_textures[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frame->width/2, frame->height/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, frame->data[2]);

glGetUniformLocationTrX拜客生活常识网

从片段着色器中获取uniform变量的引用TrX拜客生活常识网

glUniform1iTrX拜客生活常识网

给uniform变量的引用赋int类型的值TrX拜客生活常识网

glActiveTextureTrX拜客生活常识网

启用纹理槽,OpenGL支持32个纹理槽,GL_TEXTURE0 - GL_TEXTURE31TrX拜客生活常识网

glBindTextureTrX拜客生活常识网

将本地代码里创建的纹理绑定到系统的纹理槽上TrX拜客生活常识网

glTexImage2DTrX拜客生活常识网

在纹理槽上填充纹理图像数据TrX拜客生活常识网

4.4.4 呈现

glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
eglSwapBuffers(m_display, m_surface);

glClearTrX拜客生活常识网

清理画布TrX拜客生活常识网

glDrawArraysTrX拜客生活常识网

绘制顶点,在前面加入的顶点数组中连贯地画连续4个点的连线。TrX拜客生活常识网

GL_POINTS - 单独的将顶点画出来。TrX拜客生活常识网

GL_LINES - 单独地将直线画出来。行为和 GL_TRIANGLES 类似。TrX拜客生活常识网

GL_LINE_STRIP - 连贯地将直线画出来。行为和 GL_TRIANGLE_STRIP 类似。TrX拜客生活常识网

GL_LINE_LOOP - 连贯地将直线画出来。行为和 GL_LINE_STRIP 类似,但是会自动将最后一个顶点和第一个顶点通过直线连接起来。TrX拜客生活常识网

GL_TRIANGLES - 这个参数意味着OpenGL使用三个顶点来组成图形。所以,在开始的三个顶点,将用顶点1,顶点2,顶点3来组成一个三角形。完成后,在用下一组的三个顶点(顶点4,5,6)来组成三角形,直到数组结束。TrX拜客生活常识网

GL_TRIANGLE_STRIP - OpenGL的使用将最开始的两个顶点出发,然后遍历每个顶点,这些顶点将使用前2个顶点一起组成一个三角形。TrX拜客生活常识网

TrX拜客生活常识网

无论多复杂的图像,OpenGL都是靠这种一个一个的小三角形拼接而成的。

相关阅读:

  • 尤伯杯陈雨菲开门红,何冰娇三局险胜,中国队横扫印尼进四
  • 管理订单状态,该上状态机吗?
  • 当前正在热播的六部剧,《破事精英》排第三,你在追哪一部
  • 女孩醉心武侠,自导自演成一派,这表演看着过瘾
  • 第74集团军某旅组织侦察专业跨昼夜连贯考核——大雨未
  • A股,或将迎来一次大洗牌
  • 第74集团军某旅组织侦察专业跨昼夜连贯考核
  • 陪你笑,看你闹
  • 酒局小游戏,无道具(3.0)
  • 西媒:超仿真机器人能表达感情
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。