opengl纹理

opengl读取灰度图生成三维地形并添加光照

戏子无情 提交于 2019-12-03 13:34:29
转自: https://www.cnblogs.com/gucheng/p/10152889.html 准备第三方库 glew、freeglut、glm、opencv 准备一张灰度图 最终效果 代码如下 代码包括主程序源文件mainApp.cpp、顶点着色器shader.vs、片元着色器shader.fs mainApp.cpp #include <stdio.h> #include <string.h> #include <iostream> #include <fstream> #include <sstream> #include <GL/glew.h> #include <GL/freeglut.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> using namespace std; using namespace cv; using namespace glm; //shader文件 const char* vsShaderName = "shader.vs";/

OpenGL ES 纹理

匿名 (未验证) 提交于 2019-12-03 00:18:01
// // ViewController.m // OpenGL_Ch3_1 // // Created by Ansel on 2018/4/19. // // #import "ViewController.h" // This data type is used to store information for each vertex typedef struct { GLKVector3 positionCoords; GLKVector2 textureCoords; } SceneVertex; // Define vertex data for a triangle to use in example, relative screen center static const SceneVertex vertices[] = { {{- 0.5f , - 0.5f , 0.0 }, { 0.0 , 0.0 }}, // lower left corner {{ 0.5f , - 0.5f , 0.0 }, { 1.0 , 0.0 }}, // lower right corner {{- 0.5f , 0.5f , 0.0 }, { 0.0 , 1.0 }}, // upper left corner }; @interface ViewController () {

OpenGL(6)――坐标系

匿名 (未验证) 提交于 2019-12-02 23:45:01
在掌握基本变换后,学习如何变换coordinate space。 对coordinate space进行变换的目的是将local space中各顶点坐标转换成normalized device coordinate (NDC),然后传递到Fragment Shader中。对于OpenGL,为了能够最终显示在屏幕上,被转换成NDC的顶点坐标的x、y和z坐标范围应当在[-1, 1],并遵循左手坐标系原则,即坐标范围超出[-1, 1]顶点,均是不可见的。coordinate space变换的步骤如下图所示: 记住五个坐标系和三个矩阵!在编写程序时,也是对这三个矩阵进行操作。分别解释它们的作用: 1. model matrix model matrix将local coordinate变换为world coordinate。想象一个等边三角形,在最开始它处于local space,坐标系原点就是三角形的中心点。当渲染多个等边三角形时,对于每个处于local space的三角形来说,坐标系原点均是自身的中心点。在对三角形进行scale、rotate和translate后,三角形被分散在了各处,并处在world space中,此时需要一个新的坐标系来表示各三角形的顶点坐标,即world coordinate。也很容易看出,在这个例子中,model matrix就是对三角形进行scale

OpenGL ES 纹理基础

和自甴很熟 提交于 2019-12-02 14:42:29
位图 位图是一系列的 0 和 1, 表示打开或关闭的像素值 . 位图中 , 一块内存中的每个位正好对应于屏幕上的一个像素的状态 . 它可 以表示掩码 , 字体和字符多边形甚至是两色的抖动图像 . 像素图 与位图相比 , 像素图更有趣 , 用途更大 . 像素图在内存中的布局与位图相似 . 但是 , 它的每个像素可以由超过 1 个位的存储空 间表示 . 每个像素所多出来的这些位可以存储这个像素的强度 ( 有时候称为亮度值 ) 或颜色分值 . 和位图一样 , 我们也是在当 前的光栅位置上绘图像素图 , 但是需要使用一个新的函数来绘制 . void glDrawPixels ( GLsizei width, GLsizei height, GLenum format,GLenum type, const void *pixels); 来源: https://blog.csdn.net/qq_30124547/article/details/102776261

OpenGL函数思考-glTexParameter

六眼飞鱼酱① 提交于 2019-11-30 00:34:06
OpenGL函数思考-glTexParameter 函数原型: void glTexParameterf(GLenum target,GLenum pname, GLfloat param) void glTexParameteri(GLenum target,GLenum pname,GLint param) 参数说明: target: 指定目标纹理,它只能取值GL_TEXTURE_1D或者GL_TEXTURE_2D; pname:指定单值纹理参数的符号名称,可以选择的符号常数如下:GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_S、 GL_TEXTURE_WRAP_T; param:指定pname的值 函数说明: 图象从纹理图象空间映射到帧缓冲图象空间(映射需要重新构造纹理图像,这样就会造成应用到多边形上的图像失真),这时就可用glTexParmeteri()函数来确定如何把纹理象素映射成像素. 案例: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); GL_TEXTURE_2D: 操作2D纹理. GL_TEXTURE_WRAP_S: S方向上的贴图模式. GL_CLAMP: 将纹理坐标限制在0.0,1.0的范围之内.如果超出了会如何呢

OpenGL光照2:材质和光照贴图

不羁岁月 提交于 2019-11-27 13:31:28
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 材质 在现实世界里,每个物体会对光产生不同的反应,钢看起来通常会比陶瓷花瓶更闪闪发光,木头箱子也不会像钢制箱子那样对光产生很强的反射 每个物体对镜面高光也有不同的反应,有些物体反射光的时候不会有太多的散射(Scatter),因而产生一个较小的高光点,而有些物体则会散射很多,产生一个有着更大半径的高光点,如果我们想要在OpenGL中模拟多种类型的物体,我们必须为每个物体分别定义一个 材质(Material) 属性 之前我们指定了一个物体和光的颜色,以及结合环境光和镜面强度分量,来定义物体的视觉输出,当描述一个物体的时候,我们可以用这三个分量来定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,我们就能够对物体的颜色输出有着精细的控制了 现在,我们再添加 反光度(Shininess) 这个分量到上述的三个颜色中,这就有我们需要的所有材质属性了 //片段着色器 #version 330 core struct

OpenGL光照3:光照贴图

 ̄綄美尐妖づ 提交于 2019-11-27 12:56:45
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 前言 之前我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法,这样子能够很容易在一个光照的场景中给每个物体一个独特的外观,但是这仍不能对一个物体的视觉输出提供足够多的灵活性 我们将整个物体的材质定义为一个整体,但现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成,也就是说物体在不同的部件上都有不同的材质属性 所以,我们目前的材质系统是肯定不够的,它只是一个最简单的模型,所以我们需要拓展之前的系统,引入 漫反射 和 镜面光贴图(Map) ,这允许我们对物体的漫反射分量(以及间接地对环境光分量,它们几乎总是一样的)和镜面光分量有着更精确的控制 漫反射贴图 我们希望通过某种方式对物体的每个片段单独设置漫反射颜色,有能够让我们根据片段在物体上的位置来获取颜色值得系统吗? 这可能听起来很熟悉,而且事实上这个系统我们已经使用很长时间了,这听起来很像在之前详细讨论过的 纹理 ,其实的确就是如此,我们仅仅是 对同样的原理使用了不同的名字 :纹理和贴图其实都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值,在光照场景中,它通常叫做一个 漫反射贴图

OpenGL纹理贴图

早过忘川 提交于 2019-11-26 20:49:06
1.纹理贴图的步骤 1)创建纹理对象,并为它指定一个纹理。 glGenTextures() glGenerateMipmap() 2)确定纹理如何应用到每个像素上 glTexEnvf() glBindTexture() GL_TEXTURE_CUBE_MAP、GL_TEXTURE_2D、GL_TEXTURE_1D、GL_TEXTURE_3D glTexParameteri() glTexImage2D() 3)启用纹理贴图功能 glEnable(GL_TEXTURE_XX) 4)绘制场景,提供纹理坐标和几何图形坐标。 glTexCoord2f() glDeleteTextures() 转载于:https://www.cnblogs.com/lemonrong/p/4100328.html 来源: https://blog.csdn.net/weixin_30519071/article/details/99114369

OpenGL缓冲区

对着背影说爱祢 提交于 2019-11-26 20:48:57
缓冲区保存在GPU内存中, 可以在CPU不介入的情况下,完成数据操作。 1. 创建缓冲区 glGenBuffers() 2. 绑定缓冲区 glBindBuffer() 缓冲区绑定点: GL_ARRAY_BUFFER数组缓冲区存储颜色、位置、纹理坐标等顶点属性,或者其他自定义属性 GL_COPY_READ_BUFFER用作glCopyBufferSubData进行复制的数据源 GL_COPY_WRITE_BUFFER用作glCopyBufferSubData进行复制的数据源 GL_ELEMENT_ARRAY_BUFFER索引数组缓冲区,用于保存glDrawElements、glDrawRangeElements和glDrawElementsInstanced的索引 像素缓冲区(PBO)绑定点 GL_PIXEL_PACK_BUFFER像素包装操作的源缓冲区glReadPixels GL_PIXEL_UNPACK_BUFFER纹理更新函数的目标缓冲区glTexImage1D, glTexImage2D, glTexImage3D, glTexSubImage1D, glTexSubImage2D, glTexSubImage3D GL_TEXTURE_BUFFER着色器可以通过纹理单元拾取来访问的缓冲区 GL_TRANSFORM_FEEDBACK_BUFFER变换反馈顶点着色器

OpenGL学习笔记:单一纹理

守給你的承諾、 提交于 2019-11-26 17:16:46
#include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> #include <windows.h> #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; // 定义顶点着色器 // 我们需要调整顶点着色器使其能够接受顶点坐标为一个顶点属性,并把坐标传给片段着色器 const char *vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 aPos;\n" "layout (location = 1) in vec3 aColor;\n" "layout (location = 2) in vec2 aTexCoord;\n" "out vec3 ourColor;\n" "out vec2 TexCoord;\n" "void main()\n" "{\n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" " ourColor = aColor;\n"