
着色器
hankern
Code World,Cool Life
展开
-
OpenGL 各个shader的作用和区别
OpenGL 各个shader的作用和区别penGL4.0发布了Tessellation shader(Control + Evaluation shader)。到OpenGL4.* 为止,现在OpenGL已经支持了5种不同类型的shader。1.Vertex Shader,简称VS2.TESS Control Shader (D3D11 叫Hull shader),简称TCS...转载 2018-12-03 06:28:17 · 1379 阅读 · 0 评论 -
osgEarth对Shaders.cpp.in的处理
为什么要使用Shaders.cpp.in(还有MPShaders.cpp.in SimpleSkyShaders.cpp.in SplatShaders.cpp.in DetailShaders.cpp.in)?主要是为了实现shader的单独成文件,不用硬编码到cpp文件中。借助CMake对Shaders.cpp.in进行处理,重新生成cpp文件,从而将shader文件编码到这个新cpp中...原创 2019-01-27 16:59:38 · 704 阅读 · 2 评论 -
osg的shader使用过程
方法一(osg)://创建shaderosg::Shader* vShader = new osg::Shader(osg::Shader::VERTEX, vertexSource);osg::Shader* gShader = new osg::Shader(osg::Shader::GEOMETRY, geomSource);osg::Shader* fShader = new ...原创 2019-01-17 06:29:18 · 3968 阅读 · 0 评论 -
openGL之API学习(五)光照
基本的光照模型主要包括‘环境光/漫反射/镜面反射’。环境光是在晴天室外到处看到的光的类型环境光也就被建模为一个没有光源、没有方向并且对场景中的所有物体产生相同的点亮效果的一种光。环境光在很多情况下会被尽量的避免去考虑,因为它看上去有点太人工化,简单的实现并不会使场景更真实。使用一些更高级的技术比如全局光照会减少对环境光的需求,因为其实还要考虑光从物体表面反射后又照到其他物体上的事实。...原创 2019-03-06 06:23:47 · 409 阅读 · 0 评论 -
纹理单元、纹理对象、纹理类型、取样器对象
纹理对象包含着纹理贴图自身的数据,比如:纹素。纹理对象并不是直接绑定到shader上的(事实上是采样阶段发生的地方),而是绑定到‘纹理单元’上,‘纹理单元’的索引会被传到shader中,因此shader是通过纹理单元得到纹理对象的。一般可以同时有多个可用的纹理单元,数量上限取决于显卡的容量。为了将一个纹理对象A绑定到纹理单元0上,首先你需要激活纹理单元0然后绑定纹理对象A。应该是纹理对象直...原创 2019-03-03 08:06:51 · 3160 阅读 · 0 评论 -
out can't be used with non-varying FragColor
因为片段着色器缺少glsl的版本号,加上版本号就可以了#version 330 //不能缺少in vec2 TexCoord0;out vec4 FragColor;uniform sampler2D gSampler;void main(){ FragColor = texture2D(gSampler, TexCoord0.st);};...原创 2019-03-03 10:53:09 · 989 阅读 · 0 评论 -
openGL之API学习(四)纹理操作
纹理操作代码流程://向着色器传递纹理单元glUniform1i(gSampler, 0);//向GPU上传纹理数据GLuint m_textureObj;glGenTextures(1, &m_textureObj);//生成一个纹理对象,(一个纹理对象有多个纹理目标GL_TEXTURE_1D, 2D, 3D or CUBE_MAP等)glBindTexture...原创 2019-03-03 11:24:29 · 764 阅读 · 0 评论 -
openGL之API学习(六)如何绑定深度缓冲区到片元着色器
本质是使用帧缓冲区glBindFramebuffer(GL_FRAMEBUFFER, m_fbo),深度缓存是帧缓冲区的一个挂载点在OpenGL中3d管线输出的结果称为‘帧缓冲对象‘(简称FBO)。FBO可以挂载颜色缓冲(在屏幕上显示)、深度缓冲区和一些有其他用处的缓冲区。当glutInitDisplayMode()被调用的时候,它使用一些特定的参数来创建默认的帧缓存,这个帧缓存被窗口系统所管...原创 2019-03-10 09:21:21 · 805 阅读 · 0 评论 -
openGL之API学习(十)glReadBuffer
该函数主要是确定颜色缓冲区的来源(不会影响到深度、模板等缓冲区的读取),这里的设置将会影响到glReadPixels, glCopyTexImage1D, glCopyTexImage2D, glCopyTexSubImage1D, glCopyTexSubImage2D, glCopyTexSubImage3D的读取结果。函数名字Name为像素选择颜色缓冲区源glReadBuff...原创 2019-03-15 06:16:44 · 5348 阅读 · 0 评论 -
openGL之API学习(七)Unable to get the location of uniform
在使用下面代码时遇到该错误m_textureLocation = GetUniformLocation("gShadowMap");着色器的代码为#version 330 ...原创 2019-03-12 06:28:06 · 387 阅读 · 0 评论 -
openGL之API学习(八)glutSwapBuffers
glutSwapBuffers函数是OpenGL中GLUT工具包中用于实现双缓冲技术的一个重要函数。该函数的功能是交换两个缓冲区指针。通常, 我们所看到的窗体、文字、图像,从根本上来说都是“画”出来的。比如,制作一个简单的五子棋, 我们可能先要绘制棋盘,然后绘制棋子,我们可能还要绘制一些提示信息。虽然这些绘制操作有一定的先后顺序,通常情况下,操作系统的这些绘制速度非常的快,使人眼误认为这些绘制...原创 2019-03-12 06:40:01 · 1289 阅读 · 0 评论 -
openGL之API学习(十一)glPixelStoref
设置像素的存储模式,对后续的glDrawPixels,glReadPixels,glPolygonStipple,glBitmap,glTexImage{1,2,3}D,glTexSubImage{1,2,3}D产生影响,如果OpenGL支持ARB_imaging扩展,那么还会影响glConvolutionFilter{1,2,3}D,glColorTable,glColorSubTable,gl...原创 2019-03-16 16:36:02 · 514 阅读 · 0 评论 -
openGL之API学习(十二)glReadPixels
从缓冲区中读取数据(可以是颜色、深度等数据),缓冲区可以是当前窗口缓冲区,也可以是自定义的帧缓冲区FBO。使用窗口缓冲区需要用glReadBuffer来指定使用FBO需要用glBindFramebuffer来指定,当然如果绑定为0,则认为时窗口缓冲区void glReadPixels( GLint x, GLint y, GLsizei width,GLsizei height, GL...原创 2019-03-16 16:51:29 · 2264 阅读 · 0 评论 -
openGL之API学习(九)glClear
函数原型: void glClear(GLbitfield mask);参数说明: GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位 GL_COLOR_BU...原创 2019-03-12 18:37:38 · 615 阅读 · 0 评论 -
openGL之API学习(十六)glViewport
确定要绘制的区域。如果你打算把整个屏幕渲染到一个或大或小的纹理上,你需要用新的纹理的尺寸作为参数再次调用glViewport(要在渲染到你的帧缓冲之前做好),否则只有一小部分纹理或屏幕能够绘制到纹理上。void glViewport( GLint x, GLint y, GLsizei width, GLsizei height);x, y...原创 2019-03-24 19:44:32 · 506 阅读 · 0 评论 -
openGL之API学习(十八)glGenRenderbuffers
生成渲染缓冲区对象,可以和帧缓冲区进行绑定。和纹理对象关系?渲染缓冲区对象以OpenGL原生渲染格式储存它的数据,因此在离屏渲染到帧缓冲的时候,这些数据就相当于被优化过的了。void glGenRenderbuffers( GLsizei n, GLuint *renderbuffers)n Specifies the number of renderbuff...原创 2019-03-25 06:15:50 · 2178 阅读 · 0 评论 -
openGL之API学习(十七)glCheckFramebufferStatus
检查帧缓冲区的使用操作类型是否已准备好。FBO完整性的判别法则如下:与FBO挂接的二维数组对象的长度和宽度必须不能为0。 如果一个二维数组对象被挂接到FBO的颜色缓冲区挂接点时,二维数组必须具有内部颜色格式(GL_RGBA, GL_DEPTH_COMPONENT, GL_LUMINANCE等)。 如果一个二维数组对象被挂接到FBO的深度缓冲区挂接点时,二维数组必须具有内部深度格式(GL...原创 2019-03-25 06:41:02 · 3388 阅读 · 0 评论 -
openGL之API学习(十九)glRenderbufferStorage
为渲染缓冲区对象的图像分配显存空间,包括格式和维度大小。void glRenderbufferStorage( GLenum target, GLenum internalformat, GLsizei width, GLsizei height);target Specifies a binding target of the all...原创 2019-03-25 06:50:07 · 436 阅读 · 0 评论 -
openGL之API学习(二十一)glFramebufferRenderbuffer
将渲染缓冲区挂载到当前帧缓冲区上void glFramebufferRenderbuffer( GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);target Specifies the target to which th...原创 2019-03-25 14:20:41 · 4946 阅读 · 0 评论 -
openGL之API学习(十三)glDrawBuffer
指定在当前帧缓冲区的哪个颜色缓冲区进行绘制,并不影响深度、模板缓冲区。void glDrawBuffer (GLenum mode);GL_FRONT: 单缓存的默认值GL_FRONT_RIGHT:GL_NONE:不写入颜色缓冲区,如果存在片段着色器则不启用该着色器GL_FRONT_LEFT:GL_FRONT_AND_BACK:GL_RIGHT:GL_AUXi: i表...原创 2019-03-22 06:12:08 · 5219 阅读 · 0 评论 -
openGL之API学习(二十二)glBlitFramebuffer
void glBlitFramebuffer( GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask,...原创 2019-03-25 17:47:54 · 4350 阅读 · 0 评论 -
openGL之API学习(二十三)glBindBuffer
使用生成过的缓冲区void glBindBuffer( GLenum target, GLuint buffer);target Specifies the target to which the buffer object is bound, which must be one of the buffer binding targets in the fol...原创 2019-03-26 06:29:37 · 786 阅读 · 0 评论 -
openGL之API学习(二十四)glGetError
返回opengl操作的错误标志,调用后会将错误标志设置为GL_NO_ERRORGLenum glGetError( void);原创 2019-03-26 06:34:50 · 592 阅读 · 0 评论 -
openGL之API学习(三十一)glVertexAttribPointer
指定了渲染时着色器索引值为 index 的顶点属性数组(颜色、纹理、法线坐标)的数据格式和位置,用于从内存向显存上传数据(数据是由glBufferData之类的方式从内存上传到显存的)。属性数组中的值在VBO中存放。顶点属性glVertexAttribPointer默认是关闭的,使用时要以顶点属性位置值为参数调用glEnableVertexAttribArray开启,如glEnableVertex...原创 2019-03-30 08:19:40 · 3347 阅读 · 0 评论 -
openGL之API学习(三十三)查看opengl、显卡的信息
const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字 const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台 const GLubyte* OpenGLVersion = glGetStrin...原创 2019-03-30 22:00:15 · 1521 阅读 · 0 评论 -
openGL之API学习(十四)glBindFramebuffer
使用帧缓冲区void glBindFramebuffer( GLenum target, GLuint framebuffer);Parameterstarget Specifies the framebuffer target of the binding operation.指定帧缓冲区的使用操作类型,可以取GL_DRAW_FRAMEBUFFER,...原创 2019-03-23 23:04:43 · 2877 阅读 · 0 评论 -
openGL之API学习(二十五)窗体默认FBO与手工创建的FBO的区别
第一,通过手工创建的FBO不能用于将渲染结果直接显示到窗口输出区,通过手工创建的FBO只能用于屏外渲染(Off-screen Rendering);第二,窗体系统生成的FBO在创建的时候就拥有颜色缓冲区,深度缓冲区,模版缓冲区,且创建后就为这些缓冲区分配了空间。而手工创建的FBO需要手动为其添加各个缓冲区,并为其申请空间。窗体系统创建的FBO中的各个缓冲区对象不能与手动创建的FBO的挂接点挂接,反...原创 2019-03-27 06:01:11 · 398 阅读 · 0 评论 -
openGL之API学习(二十六)glTexImage2D
给2维纹理分配显存空间,也可以从内存向显存拷贝数据。void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, ...原创 2019-03-27 06:40:37 · 1891 阅读 · 0 评论 -
openGL之API学习(三十四)highp mediump lowp
如果用GLSL ES编写的着色器,浮点精确度规定如下:highp – 32位浮点格式,适合用于顶点变换,但性能最慢。 mediump – 16位浮点格式,适用于纹理UV坐标和比highp大约快两倍 lowp – 10位的顶点格式,适合对颜色,照明计算和其它高性能操作,速度大约是highp 的4倍如果是用CG编写的着色器或是一个表面着色器,指定精度如下:float – 类似于在...原创 2019-03-31 13:17:05 · 10907 阅读 · 0 评论 -
openGL之API学习(三十七)如何从FBO中读取颜色、深度信息
方法一、保存成图片QImage* img=new QImage(WINDOW_WIDTH,WINDOW_HEIGHT,QImage::Format_ARGB32); uchar* tmpBIT = img->bits(); //从颜色缓冲区中读取数据 int tmpPixelSize = WINDOW_WIDTH*WINDOW_HEIGHT * 4; ...原创 2019-04-05 07:26:31 · 1467 阅读 · 0 评论 -
openGL之API学习(三十五)texture和texture2D
纹理采样函数texture2D() is deprecated as of (at least) OpenGL 3.3; see page 99 of the 3.30 GLSL specification. It will continue to be supported in OpenGL compatibility profiles to avoid breaking existing ...原创 2019-03-31 22:35:50 · 5843 阅读 · 0 评论 -
openGL之API学习(三十六)如何在着色器中自动识别版本号
#if __VERSION__ < 130#define TEXTURE2D texture2D#else#define TEXTURE2D texture#endif#if __VERSION__ > 120 color = texture(sampler, texCoord);#else color = texture2D(sampler, ...原创 2019-03-31 22:55:13 · 349 阅读 · 0 评论 -
openGL之API学习(二十八)glClearDepth
设置清空深度缓冲区时的值,范围会自动截取到[0,1]大于1的取1,小于0的取0.默认值为1void glClearDepth( GLdouble depth);depth Specifies the depth value used when the depth buffer is cleared. The initial value is 1.指定深度缓冲区清除时设...原创 2019-03-27 22:51:16 · 359 阅读 · 0 评论 -
openGL之API学习(二十九)glDepthRange
将规范化的深度范围(-1~+1)通过线性变换映射到(nearVal~farVal),这个范围不能超出(0~1)这个函数的作用一般是分层渲染,比如要渲染一副从窗户看外面世界的场景,可以将外面场景的深度值映射为0.5~1,将室内场景深度值映射为0~0.5。再比如在场景上添加按钮,可以将场景深度值映射为0.1~1,按钮的深度值映射为0~0.1void glDepthRange( GLdo...原创 2019-03-27 23:03:10 · 879 阅读 · 3 评论 -
openGL之API学习(三十)深度缓冲区深度值为负值
通过glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, tmpPixelsBuffer);从帧缓冲区中读取深度信息,深度值竟然是负值。设置glDepthRange(0,1);也不起作用。原因分析:(1)不使用glDepthRange(0,1);...原创 2019-03-28 06:31:54 · 928 阅读 · 0 评论 -
openGL之API学习(二十七)glEnable
开启服务器端的opengl功能void glEnable( GLenum cap);GL_BLEND If enabled, blend the computed fragment color values with the values in the color buffers. See glBlendFunc.GL_CLIP_DISTANCE i If e...原创 2019-03-27 21:27:58 · 766 阅读 · 0 评论 -
openGL之API学习(四十四)纹理烘焙
指把场景中的光照信息保存至贴图上,使场景中的对光照的多种影响因素都保留下来。原创 2019-04-11 06:17:08 · 750 阅读 · 0 评论 -
openGL之API学习(三十八)投影变换公式
原文在https://blog.youkuaiyun.com/gggg_ggg/article/details/45969499这里只记录几个重要结论1、正交投影变换1.1一般形式1.2常用形式2、透视投影2.1一般形式2.2常用形式经过投影变换后,视椎体中的点变换到了一个立方体中,x范围[-1,1],y范围[-1,1],z范围[0,1]这里的z...原创 2019-04-07 17:42:35 · 672 阅读 · 0 评论 -
openGL之API学习(四十五)正向渲染和延迟渲染
如果你是一个游戏开发者,在你使用的图形引擎中或多或少都听说过forward rendering和deferred rendering。通常你必须在你的游戏中选择一种。但它们是什么,彼此之间有什么不同,我们又该如何选择呢?Modern Graphics Pipelines(现代图形管道)在开始之前,我们必须要知道一点现代可编程图形管线的一些知识。早些时候,我们被显卡的功能限制,不能去改变每个...原创 2019-04-11 21:14:48 · 600 阅读 · 0 评论 -
openGL之API学习(四十六)opengl图形管线
管线详解下面这个图取自《OpenGL ES 3.0编程指南》,此流程为可编程管线。1.VBO/VAO(顶点缓冲区对象或顶点数组对象):VBO/VAO(到底是啥,下回讲解)是cpu提供给GPU的顶点信息,包括了顶点的位置、颜色(只是顶点的颜色,和纹理的颜色无关)、纹理坐标(用于纹理贴图)等顶点信息。2.VertexShader(顶点着色器):顶点着色器是处理VBO/VAO提供...原创 2019-04-11 21:39:24 · 1026 阅读 · 0 评论