#include"glsl.h"
void SHADER::drawBox()
{
glBegin(GL_QUADS);
// Front Face
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
// Back Face
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
// Top Face
glNormal3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
// Bottom Face
glNormal3f( 0.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
// Right face
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
// Left Face
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
} void SHADER::drawMuBox()
{
glBegin(GL_QUADS);
glMultiTexCoord2f(GL_TEXTURE0,0.0f, 0.0f);
glMultiTexCoord2f(GL_TEXTURE1,0.0f, 0.0f);
glVertex2f(-10.0 , -10.0 ); glMultiTexCoord2f(GL_TEXTURE0,1.0f, 0.0f);
glMultiTexCoord2f(GL_TEXTURE1,1.0f, 0.0f);
glVertex2f( , -10.0 ); glMultiTexCoord2f(GL_TEXTURE0,1.0f, 1.0f);
glMultiTexCoord2f(GL_TEXTURE1,1.0f, 1.0f);
glVertex2f(10.0 , 10.0 ); glMultiTexCoord2f(GL_TEXTURE0,0.0f, 1.0f);
glMultiTexCoord2f(GL_TEXTURE1,0.0f, 1.0f);
glVertex2f(-10.0 , 10.0);
glEnd();
}
void SHADER::setup()
{
init_light();
setShaders();
m_fps.setup();
m_img1.Load("2.jpg");
m_img2.Load("3.jpg");
}
char * SHADER::textFileRead(char *fn)
{ FILE *fp;
char *content = NULL; int count=; if (fn != NULL)
{
fp = fopen(fn,"rt"); if (fp != NULL)
{ fseek(fp, , SEEK_END);
count = ftell(fp);
rewind(fp); if (count > )
{
content = (char *)malloc(sizeof(char) * (count+));
count = fread(content,sizeof(char),count,fp);
content[count] = '\0';
}
fclose(fp);
}
}
return content;
} void SHADER::setShaders()
{
char *vs = NULL,*fs = NULL,*fs2 = NULL;
v = glCreateShader(GL_VERTEX_SHADER);
f = glCreateShader(GL_FRAGMENT_SHADER);
f2 = glCreateShader(GL_FRAGMENT_SHADER); vs = textFileRead("toonf2.vert");
fs = textFileRead("toonf2.frag"); const char * vv = vs;
const char * ff = fs; glShaderSource(v, , &vv,NULL);
glShaderSource(f, , &ff,NULL); free(vs);free(fs); glCompileShader(v);
glCompileShader(f); printShaderInfoLog(v);
printShaderInfoLog(f);
printShaderInfoLog(f2); p = glCreateProgram();
glAttachShader(p,v);
glAttachShader(p,f); glLinkProgram(p);
printProgramInfoLog(p); glUseProgram(p);
loc = glGetUniformLocation(p,"time"); samplerA = glGetUniformLocation(p, "texA");
glUniform1i(samplerA, ); // pass in texture samplerB = glGetUniformLocation(p, "texB");
glUniform1i(samplerB, ); // pass in texture
} void SHADER::draw()
{
static float angle =0.0f;
static float time =0.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
glTranslatef(,-,-);
glRotatef(angle++,,,); glUniform1f(loc, time);
glScalef(6.0,6.0f,6.0);
//glutSolidTeapot(1);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_img1.ID);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,m_img2.ID);
// glBindTexture(GL_TEXTURE_2D,m_img1.ID);
drawBox();
//drawMuBox();
glDisable(GL_TEXTURE_2D);
time+=0.01f;
m_fps.update();
//printf("fps:%d \n",m_fps.getFPS()); } void SHADER::init_light()
{
static GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; // 环境光参数
static GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // 漫射光参数
static GLfloat LightPosition[]= { 0.0f, 100.0f, 2.0f, 1.0f }; // 光源位置 glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 设置环境光
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫射光
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置 glEnable(GL_LIGHT1); // 启用一号光源
glEnable(GL_LIGHTING); } int SHADER::printOglError(char *file, int line)
{
//
// Returns 1 if an OpenGL error occurred, 0 otherwise.
//
GLenum glErr;
int retCode = ; glErr = glGetError();
while (glErr != GL_NO_ERROR)
{
printf("glError in file %s @ line %d: %s\n", file, line, gluErrorString(glErr));
retCode = ;
glErr = glGetError();
}
return retCode;
} void SHADER::printShaderInfoLog(GLuint obj)
{
int infologLength = ;
int charsWritten = ;
char *infoLog; glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength); if (infologLength > )
{
infoLog = (char *)malloc(infologLength);
glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
printf("%s\n",infoLog);
free(infoLog);
}
} void SHADER::printProgramInfoLog(GLuint obj)
{
int infologLength = ;
int charsWritten = ;
char *infoLog; glGetProgramiv(obj, GL_INFO_LOG_LENGTH,&infologLength); if (infologLength > )
{
infoLog = (char *)malloc(infologLength);
glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);
printf("%s\n",infoLog);
free(infoLog);
}
}

顶点着色器代码

uniform float time;
varying float colorx;
varying vec4 TexCoord;
void main(void)
{
vec4 v = vec4(gl_Vertex);
float temp;
temp = sin(time*5.0);
colorx =temp;
if(colorx<0.2)
colorx =0.2;
if(temp<0.5)
temp=0.5;
if(temp>1.0)
temp =1.0;
//v =v*temp;
v.z =v.z*temp;
gl_TexCoord[] =gl_MultiTexCoord0;
TexCoord = gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * v;
}

像素着色器代码:

varying float colorx;

varying vec4 TexCoord;
uniform sampler2D texA;
uniform sampler2D texB;
void main(void)
{ vec3 color = texture2D(texA,gl_TexCoord[].st).rgb + texture2D(texB,gl_TexCoord[].st).rgb;
//vec3 color = texture2D(texB,gl_TexCoord[0].st).rgb;
//vec3 color = texture2D(texA,gl_TexCoord[0].st).rgb;
color.r =color.r*colorx;
color.g =color.g*colorx;
color.b =color.b*colorx;
gl_FragColor =vec4(color,1.0); }

效果:

glsl 多重纹理的更多相关文章

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

    上一篇,我们学习了怎么便捷的控制sprite的颜色,而这个都是默认一个texture的,如果要实现类似mask的效果,或者更个性化的多纹理效果,怎么实现呢? 这就是这一节需要介绍的内容. 例如上图的效 ...

  2. 【GLSL教程】(八)纹理贴图 【转】

    http://blog.csdn.net/racehorse/article/details/6664717 简单的纹理贴图(Simple Texture) 为了在GLSL中应用纹理,我们需要访问每个 ...

  3. GLSL纹理贴图 【转】

    转载:http://blog.csdn.net/hgl868/article/details/7872466 简单的纹理贴图(Simple Texture) 为了在GLSL中应用纹理,我们需要访问每个 ...

  4. Linux OpenGL 实践篇-5 纹理

    纹理 在之前的实践中,我们所渲染的物体的表面颜色都是纯色或者根据顶点位置计算出的一个颜色,这种方式在表现物体细节方面是比较吃资源的,因为我们每增加一个细节,我们就需要定义更多的顶点及其属性.所以美术人 ...

  5. OpenGL纹理高级

    矩形纹理 对于二维纹理来说,除了GL_TEXTURE_2D之外,使用GL_TEXTURE_RECTANGLE就可以使用矩形纹理. 矩形纹理几大特点: 不能Mip,只能加载glTexImage2D的le ...

  6. android openGL ES2 一切从绘制纹理開始

    纹理.在openGL中,能够理解为载入到显卡显存中的图片.Android设备在2.2開始支持openGL ES2.0.从前都是ES1.0 和 ES1.1的版本号.简单来说,openGL ES是为了嵌入 ...

  7. SharpGL学习笔记(十六) 多重纹理映射

    多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...

  8. Cocos2D粒子发射器的纹理

    每个例子发射器只能使用单个纹理发射粒子. 如果你需要在相同粒子效果中组合多重纹理,你将不得不创建多重的发射器节点并且决定谁的粒子将在其它粒子之上或之下显示.

  9. OpenGL chapter5 基础纹理

    Chapter5 基础纹理 Contents: ==================================================== | 任务 | 使用的函数 ========== ...

随机推荐

  1. 向Oracle数据库插入一条数据

    这几天搞了一下Oracle数据库.可能用sql server习惯了,感觉好不方便.PL的界面友好度比sql server差远了 .既然都收购了PL了 为什么不给它做好一点呢?各种不便.郁闷 向Orac ...

  2. 常用的Eclipse设置

    每次新建work space的时候,我都要修改一些默认设置,每次都要花一些时间找在哪里设置,总结如下. 启动加速 1. 去掉XML Validataion Windows --> Prefere ...

  3. C++ string的用法

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是 ...

  4. 每日英语:The Biggest Distraction In The Office Is Sitting Next To You

    The big push in office design is forcing co-workers to interact more. Cubicle walls are lower, offic ...

  5. 针对Properties中实时性要求不高的配置参数,用Java缓存起来

    Properties常用于项目中参数的配置,当项目中某段程序需要获取动态参数时,就从Properties中读取该参数,使程序是可配置的.灵活的. 有些配置参数要求立即生效,有些则未必: 一.实时性要求 ...

  6. sass的学习笔记

    sass初学入门笔记(一) 我本身是个新手,一边学sass一边记下的笔记,可能有点罗嗦,但是复习起来的话还是比较全面直观的.当然,最重要的还是去实践,实践得真理 其它 CSS 预处理器语言: CSS ...

  7. SharePoint自动化系列——Error features自动deactivate

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ SharePoint Content Deployment prerequisite——Error ...

  8. 教程-Delphi中比较两个对象是否一致及地址是否相同

    资料说明: 1.http://blog.csdn.net/diligentcatrich/article/details/7077294 说明: 实例代码: procedure TForm1.btn1 ...

  9. [转]关闭word进程

    命名空间 :System.Diagnostics 以前在word的时候,经常碰到word进程产生一大堆,怕关错了,把用户自己打开的word也关闭,一直搞忽悠,今天上网花了10块钱,下了个文件,给我了一 ...

  10. C语言 · 芯片测试

    基础练习 芯片测试   时间限制:1.0s   内存限制:512.0MB    问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯 ...