opengl纹理

Android OpenGL Note

╄→尐↘猪︶ㄣ 提交于 2020-04-07 06:43:04
1.GLSurfaceView有两种渲染模式: RENDERMODE_CONTINUOUSLY:连续的绘制。 RENDERMODE_WHEN_DIRTY:当render创建的时候或者手动调用GLSurfaceView.requestRender后才会绘制(onDrawFrame)。 2.GL10.glMatrixMode(int mode)矩阵模型: 参数mode:GL_PROJECTION、GL_MODELVIEW、GL_TEXTURE、GL_MATRIX_PALETTE_OES (OES_matrix_palette extension) GL_PROJECTION:投影矩阵(把物体投影到平面,3维→2维),与这相关的方法有GL10:glFrustumf、glFrustumx,GLU:gluPerspective(最后也是调用GL10.glFrustumf), glOrtho 。 GL_MODELVIEW:模型视图,与这相关的方法有GLU:gluLookAt(GL10:glMultMatrixf) GL_TEXTURE:纹理矩阵 GL_MATRIX_PALETTE_OES:不知道。。。 来源: oschina 链接: https://my.oschina.net/u/101315/blog/95846

OpenGL纹理映射总结

纵然是瞬间 提交于 2020-04-04 19:19:27
1.纹理对象: 使用纹理对象来存储纹理数据的步骤: 1) 生成纹理对象名称 2) 将纹理对象绑定到纹理数据(包括图像数据数组和纹理属性), 即创建纹理对象. 3) 如果OpenGL实现高性能纹理工作集, 应检查是否有足够的空间来存储所有的纹理对象. 如没有足够空间, 应设置每个纹理对象的优先级, 以确保最常用的纹理留在工作集中 4) 绑定和重新绑定纹理对象, 以便可以将其中的纹理映射到物体上. 2.生成纹理对象名称: void glGenTextures(GLsizei n, GLint* textureNames); 功能: 通过数组textureNames返回n个未用的纹理对象名, 返回的名称不必是相邻的整数. GLboolean glIsTexture(GLint textureName); 功能: 如textureName是已被绑定的纹理对象名, 且没有被删除, 则返回GL_TRUE, 如textureName为0, 或非0, 但不是已有纹理对象的名称, 返回GL_FALSE。 注:若glGenTextures()返回, 但未使用glBindTextures()绑定, 仍返回GL_FALSE 3.创建和使用纹理对象: void glBindTexture(GLenum target, GLuint textureName); 功能: 完成下面几项工作. 1)

OpenGL--骨骼动画

一笑奈何 提交于 2020-03-18 14:46:27
理论基础 骨骼蒙皮动画其实现类似人体模型,由节点(关节)树构成,节点间通过骨骼连接,每块骨骼至多一个父节点,父节点带动子骨骼运动。具体是关节带动其对应子骨骼运动从而牵动绑定到其上的皮肤变化。骨骼是刚体不会变形,只能绕父节点旋转(构造前面章节有提–3D世界实现中的机器人手臂例子,早期的骨骼动画就是这样,不过在关节处会有明显裂缝,所以才引出现在的蒙皮概念)。而绑定到其上的皮肤顶点则是实时变换拉伸的,变换大体就是通过一些矩阵的操作来最终计算出新顶点坐标等信息,再根据这些新顶点信息进行渲染,即通过更新顶点,渲染这样不断循环形成动画。 实现步骤总结: 一,根据更新前后两个关键帧的时间值插值计算出该时刻骨骼相对于其父骨骼的新变换矩阵–骨骼顶点信息。(本实例由于是手动控制动作,直接由变化的x,y计算) 二,再计算皮肤顶点信息,首先找到影响其顶点的所有骨骼,然后计算每一骨骼对该顶点的影响,即计算出在每个独立骨骼作用下顶点的新位置。公式如下: 最后将所有这些新位置按照每一骨骼的影响权重加权求和,得到皮肤顶点信息。 三,根据这些顶点信息进行绘制。 说明: 1,我们通常会把每个关节赋予一个索引值标志,无论是储存空间上还是查找时间上,都比直接使用关节名高效得多。因为每个关节有且仅有一个父关节,只要在每个关节储存其父关节的索引,即能表示整个骨骼结构。由于根关节无父,所以其索引通常会设为无效的索引,如-1。

OpenGL纹理

瘦欲@ 提交于 2020-03-12 03:23:01
  在三维图形中,纹理映射( Texture Mapping )的方法运用得很广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以用一幅真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,则墙上的每一块砖都必须作为一个独立的多边形来画。另外,纹理映射能够保证在变换多边形时,多边形上的纹理图案也随之变化。例如,以透视投影方式观察墙面时,离视点远的砖块的尺寸就会缩小,而离视点 较近的就会大些。此外,纹理映射也常常运用在其他一些领域,如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或用大理石、木材、布匹等自然物质的图像作为纹理映射到多边形上表示相应的物体。   纹理映射有许多种情况。例如,任意一块纹理可以映射到平面或曲面上,且对光亮的物体进行纹理映射,其表面可以映射出周围环境的景象;纹理还可按不同的方式映射到曲面上,一是可以直接画上去(或称移画印花法),二是可以调整曲面颜色或把纹理颜色与曲面颜色混合;纹理不仅可以是二维的,也可以是一维或其它维的。   本章将详细介绍OpenGL纹理映射有关的内容:基本步骤、纹理定义、纹理控制、映射方式和纹理坐标等。 12.1 基本步骤   纹理映射是一个相当复杂的过程,这节只简单地叙述一下最基本的执行纹理映射所需的步骤。基本步骤如下:   1)定义纹理、2)控制滤波、3)说明映射方式、4

nehe的opengl教程

邮差的信 提交于 2020-03-05 23:04:53
这个确实是个很不错的东西,感觉国外写的教程或者教材都偏重于一些基础的东西,只是告诉你这个工具怎么用,至于具体如何创造,那是你自己的事情,而国内的教程大部分偏重于告诉你如何去用工具做这些个东西,刚好互补一下,遇到实际的东西找国内的,肯定能找到,遇到理论的就去找国外的,也肯定能找到。 今天的主要任务是看完texture文理贴图这部分的简单东西。 其实纹理贴图如果简单的用的话也还简单点,主要就是从图片中读取数据,然后绑定到纹理单元上,在绘制文理的时候讲指定的纹理单元和想要绘制的框框的位置对齐,然后就好了。 这就跟将画装入相框是一个样子的,对好位置,然后放入相片,就完事了。 纹理贴图的主要的几个2d的函数式 glGenTex glTexImage2D glTexParameteri等几个函数,具体使用的到具体的应用中才能看出来。 来源: https://www.cnblogs.com/long0x0/archive/2011/10/23/2221756.html

OpenGL超级宝典笔记——新的模式

▼魔方 西西 提交于 2020-02-28 19:51:52
在传统上,图形硬件设计的目标是快速地执行相同的硬编译的计算指令集。计算的步骤可以被跳过,参数可以被调整,但计算本身却是固定的。所以旧式的GPU设计被称为是“固定功能”的。现在的趋势是朝着通用图形处理器的方向发展。就像CPU一样,GPU也可以用任意的指令序列来执行图形计算。GPU和CPU最大的区别是,GPU的浮点数计算能力更强。 在OpenGL2.0之前是固定函数渲染管线,在OpenGL2.0之后就是可编程函数渲染管线了。 走出旧的模式 在替换掉旧的模式之前,我们来回顾一下传统的OpenGL渲染管线是如何运作的。在第一阶段的是基于顶点操作,然后是图元的光栅化产生片段,最后在写到帧缓冲区前,执行片段的纹理,雾和其他的操作。如下图,下面分别讨论基于顶点和基于片段的操作。 固定的顶点处理 基于顶点的阶段以一系列顶点的属性作为输入。这些输入包括物体空间坐标,法线,主颜色,辅助颜色,纹理坐标。最终处理输出的结果为裁剪空间坐标,正面和背面的主颜色和辅助颜色,雾坐标,纹理坐标,以及点的大小。这个处理过程被分为四个阶段。 顶点变换 在传统的固定函数管线中,顶点坐标从物体空间转换到裁剪空间。首先乘以模型视图矩阵转换到视觉空间,然后再乘以投影矩阵变换到裁剪空间。与者两个矩阵相乘是固定的程序,要“跳过”这个过程,就是把这两个矩阵都通过glLoadIdentity设置为单位阵。这样就不会产生影响

OpenGL with QtWidgets:练习之扑克翻转

徘徊边缘 提交于 2020-02-04 12:05:57
(本文是LearnOpenGL的学习笔记,教程中文翻译地址 https://learnopengl-cn.github.io/ ) 1.实现思路 (本来想拿扑克的正反面来做练习,奈何没找到免费的资源图片,白嫖不易,于是拿两张明星图片来代替了) 代码主要参考教程 "坐标系统" 一节的源码,把顶点坐标和纹理坐标传递给着色器,然后旋转model矩阵就能实现了翻转效果了。 两个纹理的位置是一样的,那么如何区分正反面呢?在OpenGL中默认逆时针的顶点顺序是正面,所以我们把 两个面的顶点顺序反一下,一个顺时针一个逆时针 就可以了。有了正反面,还需要把背面隐藏起来,OpenGL中有面剔除的功能,我们 把背面剔除 即可。(参考: https://www.jianshu.com/p/4e165df3ae26 ) glEnable(GL_CULL_FACE); //开启面剔除 glCullFace(GL_BACK); //剔除背面 //glFrontFace(GL_CW); //逆时针顶点为正面GL_CCW(默认),顺时针GL_CW 解决了正反面问题,还有个问题是如何把两张图分别贴到正反面 。开始我想的是用两个着色器程序分别绘制,但是感觉太麻烦了,索性把两张图合并到一起(这样就只有一个纹理贴图了), 用纹理坐标来分割两张图 贴到正反面。(如果其中一个图左右翻转了,把纹理坐标x翻转下就可以了) /

NDK OpenGL ES 3.0 开发(二十一):3D 模型加载和渲染

杀马特。学长 韩版系。学妹 提交于 2020-01-13 05:14:50
该原创文章首发于微信公众号:字节流动 OpenGL ES 3D 模型加载和渲染 上一节简单介绍了 常用的 3D 模型文件 Obj 的数据结构和模型加载库 Assimp 的编译 ,本节主要介绍如何使用 Assimp 加载 3D 模型文件和渲染 3D 模型。 3D 模型的设计一般是由许多小模型拼接组合成一个完整的大模型,一个小模型作为一个独立的渲染单元,我们称这些小模型为网格(Mesh)。 网格作为独立的渲染单元至少需要包含一组顶点数据,每个顶点数据包含一个位置向量,一个法向量和一个纹理坐标,有了纹理坐标也需要为网格指定纹理对应的材质,还有绘制时顶点的索引。 这样我们可以为 Mesh 定义一个顶点: struct Vertex { // 位置向量 glm : : vec3 Position ; // 法向量 glm : : vec3 Normal ; // 纹理坐标 glm : : vec2 TexCoords ; } ; 还需要一个描述纹理信息的结构体: struct Texture { GLuint id ; //纹理 id ,OpenGL 环境下创建 String type ; //纹理类型(diffuse纹理或者specular纹理) } ; 网格作为独立的渲染单元至少需要包含一组顶点数据以及顶点的索引和纹理,可以定义如下: class Mesh { Public :

OpenGL 使用 PBO 高速复制屏幕图像到内存或者纹理中

我是研究僧i 提交于 2019-12-13 20:05:27
如果你想给游戏做个截图功能,或者想把屏幕图像弄成一个纹理,你就非常需要 PBO 了 通常情况下,你想把屏幕图像的像素数据读到内存需要用 glReadPixels 然后 pixels 参数传进去一块内存地址 这样做是非常非常不好的,因为 glReadPixels 会把屏幕图像的像素数据从显卡的显存复制到内存条,这个过程就非常非常的慢,特别是数据量大的时候 然后如果你要把像素数据再用 glTexImage2D 传到纹理,数据就又要从内存条复制到显存,这个过程也是非常非常慢的,特别是数据量大的时候 那么有没有一种办法,让我们可以通过一个内存指针,直接访问显存的数据呢?当然是有的,那就是 OpenGL 的 Array Buffer 这个东西中文叫做 数组缓冲区 也可以直接省略成 缓冲区 因为它就是 显存里的 一块内存,所以我们下文就叫 缓冲区 吧 你可以用 glMapBuffer 得到它的内存指针,然后就可以为所欲为了,另外,OpenGL 很多用来返回数据的函数,都可以把数据写到缓冲区里,而不是复制到内存条。 就比如说 glReadPixels 原本你是要传一个内存指针进去的,但是有了缓冲区,它就可以把数据复制到缓冲区里而不是复制到内存条 因为,屏幕的像素数据是在显存里的,缓冲区也是在显存里的,所以,显存->复制数据->显存 速度就比 显存->复制数据->内存条 快非常非常的多

OpenGL 总结以下坐标系统之前

不问归期 提交于 2019-12-05 03:18:15
迄今为止,2D平面就已经差不多OK了。为了更好的学习3D,总结一些需要注意的小细节或者是小套路。 首先,还是要多写代码,好多东西都是记住的 使用 glfw 那一套一定要熟练哦~ 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, "OpenGL", NULL, NULL); if (window == NULL) { std::cout << "window init error" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glewExperimental = true; if (glewInit() != GLEW_OK) { std::cout << "glew init error" << std::endl; glfwTerminate(); return -1; } glViewport