OSG Shader GLSL 4.3 使用纹理 例子

OSG 中使用纹理shader 例子

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Shape>
#include <osg/Shapedrawable>
#include <osg/MatrixTransform>
#include <osg/Texture2D>

static char * vertexShader= {
		"#version 430 \n"
		"layout (location=0) in vec3 VertexPosition;\n"
		"layout (location=1) in vec2 TexCorrd;\n"
		"uniform mat4 MVP;"
		"out vec2 Corrd;\n"
		"void main()\n"
		"{\n"
		"   Corrd = TexCorrd;"
		"   gl_Position = MVP * vec4(VertexPosition,1.0);\n"
		"}\n"
};

static char * fragShader ={
		"#version 430 \n"
		"uniform sampler2D sampler2d_0;\n"
		"uniform sampler2D sampler2d_1;\n"
		"layout (location=0) out vec4 FragColor;\n"
		"in vec2 Corrd;\n"
		"void main() {\n"
		"   vec4 tmpColor = texture(sampler2d_0, Corrd);"
		"   if(Corrd[1] > 0.5 ) \n"
		"		   tmpColor = texture(sampler2d_1, Corrd); \n"
		"   FragColor = tmpColor ;\n"
		"}\n"
};

class MVPCallback: public osg::Uniform::Callback
{
public:
		MVPCallback(osg::Camera * camera):mCamera(camera){
		}
		virtual void operator()( osg::Uniform* uniform, osg::NodeVisitor* nv){
				osg::Matrix modelView = mCamera->getViewMatrix();
				osg::Matrix projectM = mCamera->getProjectionMatrix();
				uniform->set(modelView * projectM);
		}  

private:
		osg::Camera * mCamera;
}; 

osg::Node * createNode()
{
		osg::Geode * geode = new osg::Geode;

		osg::Geometry * gm = new osg::Geometry;

		osg::Vec3Array * vertexArray = new osg::Vec3Array;
		vertexArray->push_back(osg::Vec3(0,0,0));
		vertexArray->push_back(osg::Vec3(1,0,0));
		vertexArray->push_back(osg::Vec3(1,0,1));
		vertexArray->push_back(osg::Vec3(0,0,1));
		gm->setVertexArray(vertexArray);

		osg::Vec3Array * normalArray = new osg::Vec3Array;
		normalArray->push_back(osg::Vec3(0,-1,0));
		gm->setNormalArray(normalArray);
		gm->setNormalBinding(osg::Geometry::BIND_OVERALL);

		osg::Vec2Array* texcoords = new osg::Vec2Array(4);
		(*texcoords)[0].set(0.0f,0.0f);
		(*texcoords)[1].set(1.0f,0.0f);
		(*texcoords)[2].set(1.0f,1.0f);
		(*texcoords)[3].set(0.0f,1.0f);
		gm->setTexCoordArray(0,texcoords);

		gm->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,vertexArray->size()));
		geode->addDrawable(gm);

		osg::StateSet* stateset = gm->getOrCreateStateSet();

		osg::Texture2D * texture0 = new osg::Texture2D;
		texture0->setDataVariance(osg::Object::DYNAMIC); // protect from being optimized away as static state.
		texture0->setImage(osgDB::readImageFile("Images/forestWall.png"));
		stateset->setTextureAttributeAndModes(0,texture0,osg::StateAttribute::ON);

		osg::Texture2D * texture1 = new osg::Texture2D;
		texture1->setDataVariance(osg::Object::DYNAMIC); // protect from being optimized away as static state.
		texture1->setImage(osgDB::readImageFile("Images/purpleFlowers.png"));
		stateset->setTextureAttributeAndModes(1,texture1,osg::StateAttribute::ON);

		gm->setVertexAttribArray(0,vertexArray);
		gm->setVertexAttribBinding(0, osg::Geometry::BIND_PER_VERTEX);

		gm->setVertexAttribArray(1,texcoords);
		gm->setVertexAttribBinding(1, osg::Geometry::BIND_PER_VERTEX);

		return geode;
}
int main()
{
		  osg::ref_ptr<osgViewer::Viewer> viewer  = new osgViewer::Viewer;

		osg::Group * root = new osg::Group;

		osg::Node * node = createNode();
		root->addChild(node);	

		osg::StateSet * ss = node->getOrCreateStateSet();
		osg::Program * program = new osg::Program;
		program->addBindFragDataLocation("VertexPosition",0);
		program->addBindFragDataLocation("TexCorrd",1);

		osg::Shader * vS = new osg::Shader(osg::Shader::FRAGMENT,fragShader);
		osg::Shader * fS = new osg::Shader(osg::Shader::VERTEX,vertexShader);
		program->addShader(vS);
		program->addShader(fS);
		ss->setAttributeAndModes(program,osg::StateAttribute::ON);

		osg::Uniform* MVPUniform = new osg::Uniform( "MVP",osg::Matrix());
		MVPUniform->setUpdateCallback(new MVPCallback(viewer->getCamera()));
		ss->addUniform(MVPUniform);
		osg::Uniform* sample0 = new osg::Uniform("sampler2d_0",0);
		ss->addUniform(sample0);

		osg::Uniform* sample1 = new osg::Uniform("sampler2d_1",1);
		ss->addUniform(sample1);

		viewer->setSceneData(root);
		viewer->setUpViewInWindow(35, 35, 1024, 800);

		return viewer->run();
}

时间: 2024-10-27 05:23:04

OSG Shader GLSL 4.3 使用纹理 例子的相关文章

D3D 纹理 例子程序

D3D 纹理 例子程序 程序目的 将纹理图片显示到图元表面. 程序实现 #pragma once #pragma comment(lib,"winmm.lib") #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") #include<d3d9.h> #include<d3dx9.h> struct CUSTOMVERTEX { D3DXVECTO

[Unity] Shader(着色器)之纹理贴图

在Shader中,我们除了可以设定各种光线处理外,还可以增加纹理贴图. 使用 settexture 命令可以为着色器指定纹理. 示例代码: Shader "Sbin/ff2" { // 贴图采样 properties { // 变量名("描述名",类型)=值 _Color("主体", color)=(1,1,1,1) _Ambient("环境光", color)=(0.3,0.3,0.3,0.3) _Specular(&quo

cocos2d-js Shader系列3:多重纹理 multiple textures multiple samplers

上一篇,我们学习了怎么便捷的控制sprite的颜色,而这个都是默认一个texture的,如果要实现类似mask的效果,或者更个性化的多纹理效果,怎么实现呢? 这就是这一节需要介绍的内容. 例如上图的效果,下方2个球是原图,而上方的图就是由2个球通过某个公式合成的效果了.这里重点不是怎么合成,而是怎么把多个纹理推送到fragment shader中. 相信大家都会想到,首先需要在fragment shader中添加多一个Sample2D: uniform sampler2D CC_Texture0

【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现

笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ------ 光照模型原理及漫反射和高光反射的实现 [Unity Shader](五) ------ 透明效果之半透明效果的实现及原理 在游戏中,我们除了能看到游戏物体的形体轮廓,还能看到物体的一些具体外观,包括颜色,凹凸等.而实现这一步的就是使用 纹理.与纹理相对应的技术就是 纹理映射技术 ,相当于把一张图

GLSL 在OpenGL中向shader传递信息【转】

http://blog.csdn.net/hgl868/article/details/7872219 引言 一个OpenGL程序可以用多种方式和shader通信.注意这种通信是单向的,因为shader的输出只能是渲染到某些目标,比如颜色和深度缓存. OpenGL的部分状态可以被shader访问,因此程序改变OpenGL某些状态就可以与shader进行通信了.例如一个程序想把光的颜色传给shader,可以直接调用OpenGL接口,就像使用固定功能流水线时做的那样. 不过,使用OpenGL状态并不

GLSL纹理贴图 【转】

转载:http://blog.csdn.net/hgl868/article/details/7872466 简单的纹理贴图(Simple Texture) 为了在GLSL中应用纹理,我们需要访问每个顶点的纹理坐标.GLSL中提供了一些属性变量,每个纹理单元一个: attribute vec4 gl_MultiTexCoord0; attribute vec4 gl_MultiTexCoord1; attribute vec4 gl_MultiTexCoord2; attribute vec4

【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 &amp; 纹理混合

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/41175585 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本文介绍了Unity中子着色器.通道和标签相关的详细概念与写法,以及纹理的设置方法,基本的纹理混合写法,写了5个Shader作为本文Shader讲解的实战内容,最后创建了一个梦幻的光之

Unity3d之Shader编程:子着色器、通道与标签的写法 &amp; 纹理混合

一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器定义了一个渲染通道的列表,并可选是否为所有通道初始化所需要的通用状态.子着色器的写法如下: Subshader{ [Tags] [CommonState] Passdef [Passdef ...] } 也就是通过可选标签,通用状态 和 一个Pass 定义的列表构成了子着色器. 当Unity选择用于

【Unity Shader】(八) ------ 高级纹理(上)

笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题.    [Unity Shader](三) ------ 光照模型原理及漫反射和高光反射的实现    [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现    [Unity Shader](五) ------ 透明效果之半透明效果的实现及原理    [Unity Shader](六) ------ 复杂的光