OpenGL蓝宝书第七章:立体天空和纹理折射、双纹理(下)

对比了蓝宝书,才知道红宝书的优点。

reflect函数的原理在红宝书中有说明,只有对比了红宝书,才知道红宝书的定位:高级工具书。

蓝宝书作为入门级书籍,以较快的速度让读者敲到代码去思考,总遗留了需要探索的内容。

蓝宝书要看完。

红宝书要看完。

C++11 标准版英文版也看了小部分。

多线程入门都不算。

Socket只能实现基础网络连接,离真正的数据通信都算,何况多人在线对战网络模型的实现

设计模式看了又忘了,忘了又看,如果没有机会去设计模块级别的代码实现,真的血了没用,难道改UI?加班赶工哪有魄力稍微幅度大点调整代码。可惜当时没预算到需求的演化需要我去用策略模式或者装饰者模式去调整代码结构。

工厂模式:封装了类对象的生成过程,允许不同参数获取不用对象

单例模式:控制模块间的数据访问出口,减低模块之间的耦合

策略模式:也可以封装不用数据表现出统一的行为,提供了类似于单例的用法,减低耦合。

当时无心写UI,大部分时间用来实现技能和AI,谁知UI的需求演化成为压死我的最后一根稻草——因为主管们一致认为可展示的UI具有最高的优先权,或者说当时主程只希望我能完整实现UI的大大小小需求,给一个看得到的东西给我,可是,新代码一次性让我接触到3大模块,我最不喜欢偏偏是UI。加上内部一些异动,我没有适当地争取,主程又给我增加UI任务。对啊,不讨人喜欢的下场,一堆UI给你做,看你怎么进步?

至少我今天搞定了图形渲染的入门,明白了面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

要意识到变化性往往比沟通中被有意识忽略的多多了。

无意义的加班是不可能有这些进步的。虽然我走了之后你们的奖金池多了,但是主程能让人我的前任和我走了,你们之后就能让其他优秀队友走。

我选的这条路虽然辛苦,看着轻浮,只要熬过了之后我就能成为大神。

win32或其他操作系统文件头中的时间戳还没找到,怎么实现同文件副本的MD5正确校验?假设找到了,文件更新列表的加减可以由生成本地列表和获取更新列表对比差异得到,调用下载模块,覆盖或者填充在本地资源路径下。

导航网格内容中,至今没能理解三角形生成原理,人家的博士论文,想在1个月内看懂,可行性很低啊

ORGE没碰、Unreal Engine 4.0 啃不下、Cocos 3D、Gameplay3D,如何深化?

至于IK,还很远,数学、物理基础知识都要补呢。

//vp

#version 330

in vec4 vVertex;
in vec3 vNormal;
in vec2 vTexCoords;

uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
uniform mat4 mInverseCamera;

smooth out vec3 vVaryingTexCoord;
smooth out vec2 vTarnishCoords;

void main(void)
{
//在惯性系的坐标
	vec3 vEyeNormal = normalMatrix * vNormal;

	vec4 vPosition4 = mvMatrix * vVertex;
	vec3 vEyeVertex = normalize(vPosition4.xyz/vPosition4.w);

	vec4 cCoords = vec4(reflect(vEyeVertex,vEyeNormal),1.0f);//不清楚reflect的原理,导致代码思想断片,靠猜?开玩笑,还是开源比较好
	cCoords = mInverseCamera * cCoords;//全面反射场景???

	vVaryingTexCoord.xyz = normalize(cCoords.xyz); //获得是什么坐标?

	vTarnishCoords = vTexCoords.st;

	gl_Position = mvpMatrix * vVertex;
}

//fp

#version 330

smooth in vec3 vVaryingTexCoord;
smooth in vec2 vTarnishCoords;

uniform samplerCube cubeMap;
uniform sampler2D tarnishMap;

out vec4 vFragColor;

void main(void)
{
	vFragColor = texture(cubeMap, vVaryingTexCoord.stp);
	//两段纹理,只需要颜色相乘就可以了。后面的纹理为最外层色彩
	vFragColor *= texture(tarnishMap, vTarnishCoords.st);
}

//cpp

#include <GLTools.h>
#include <GLMatrixStack.h>
#include <GLFrame.h>
#include <GLFrustum.h>
#include <GLGeometryTransform.h>

#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif

GLFrame viewFrame;
GLFrustum viewFrustum;
GLMatrixStack projctionMatrix;
GLMatrixStack mvpMatrix;
GLMatrixStack modelViewMatrix;
GLGeometryTransform transformPipeLine;

GLTriangleBatch sphereBatch;
GLBatch cubeBatch;

GLuint tarnishTexture;
GLuint cubeTexture;
GLuint reflectionShader;
GLuint skyBoxShader;

GLint locMVPReflect;
GLint locMVReflect;
GLint locNormalReflect;
GLint locInvertedCamera;

GLint locCubeMap, locTarnishMap;

GLint locMVPSkyBox;

// Six sides of a cube map
const char *szCubeFaces[6] = { "pos_x.tga", "neg_x.tga", "pos_y.tga", "neg_y.tga", "pos_z.tga", "neg_z.tga" };

GLenum cube[6] = {
	GL_TEXTURE_CUBE_MAP_POSITIVE_X,
	GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
	GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
	GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
	GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
	GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
};

void ChangeSize(int w, int h)
{
	if (h <= 0)
	{
		h = 1;
	}

	glViewport(0, 0, w, h);
	viewFrustum.SetPerspective(80.0f, float(w) / float(h), 1.0f, 120.0f);
	projctionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
	transformPipeLine.SetMatrixStacks(modelViewMatrix, projctionMatrix);
}

void SetupRC(void)
{
	GLbyte * pBytes;
	int nWidth, nHeight, nComponent;
	GLenum eFormat;

	glCullFace(GL_BACK);
	glEnable(GL_DEPTH_TEST);
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

	// Load the tarnish texture
	glGenTextures(1, &tarnishTexture);
	glBindTexture(GL_TEXTURE_2D, tarnishTexture);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

	pBytes = gltReadTGABits("tarnish.tga", &nWidth, &nHeight, &nComponent, &eFormat);
	glTexImage2D(GL_TEXTURE_2D, 0, nComponent, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes);
	free(pBytes);
	glGenerateMipmap(GL_TEXTURE_2D);

	glGenTextures(1, &cubeTexture);
	glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture);

	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

	for (size_t i = 0; i < 6; ++i)
	{
		pBytes = gltReadTGABits(szCubeFaces[i], &nWidth, &nHeight, &nComponent, &eFormat);
		// border 为0,是指边框的宽度
		//eFormat 不需要 和internalFormat取值必须相同,都是指定纹理中的颜色组件
		glTexImage2D(cube[i], 0, nComponent, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes);
		free(pBytes);
	}
	glGenerateMipmap(GL_TEXTURE_CUBE_MAP);

	viewFrame.MoveForward(-4.0f);
	gltMakeSphere(sphereBatch, 1.0f, 52, 26);
	gltMakeCube(cubeBatch, 20.0f);

	reflectionShader = gltLoadShaderPairWithAttributes("Reflection.vp", "Reflection.fp", 3,
		GLT_ATTRIBUTE_VERTEX, "vVertex",
		GLT_ATTRIBUTE_NORMAL, "vNormal",
		GLT_ATTRIBUTE_TEXTURE0, "vTexCoords");
	//uniform值绑定
	locMVPReflect = glGetUniformLocation(reflectionShader, "mvpMatrix");
	locMVReflect = glGetUniformLocation(reflectionShader, "mvMatrix");
	locNormalReflect = glGetUniformLocation(reflectionShader, "normalMatrix");
	locInvertedCamera = glGetUniformLocation(reflectionShader, "mInverseCamera");

	locCubeMap = glGetUniformLocation(reflectionShader, "cubeMap");
	locTarnishMap = glGetUniformLocation(reflectionShader, "tarnishMap");

	skyBoxShader = gltLoadShaderPairWithAttributes("skyBox.vp", "skyBox.fp", 1, GLT_ATTRIBUTE_VERTEX, "vVertex");
	//uniform值绑定

	locMVPSkyBox = glGetUniformLocation(skyBoxShader, "mvpMatrix");

	//启用两段纹理 与顶点着色器输入输出的纹理数组对应
	// glUniform1i(locCubeMap, 0);
	// glUniform1i(locTarnishMap, 1);
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, tarnishTexture);

	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture);
}

void RenderScene(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	M3DMatrix44f mCamera;
	M3DMatrix44f mCameraRotOnly;
	M3DMatrix44f mInverseCamera;

	viewFrame.GetCameraMatrix(mCamera, false);
	viewFrame.GetCameraMatrix(mCameraRotOnly, true);
	m3dInvertMatrix44(mInverseCamera, mCameraRotOnly);

	modelViewMatrix.PushMatrix();
	{

		modelViewMatrix.MultMatrix(mCamera);//向后移动 4.0f,惯性坐标系的向后则是z变小,模型变小
		glUseProgram(reflectionShader);

		glUniformMatrix4fv(locMVReflect, 1, GL_FALSE, transformPipeLine.GetModelViewMatrix());
		glUniformMatrix4fv(locMVPReflect, 1, GL_FALSE, transformPipeLine.GetModelViewProjectionMatrix());
		glUniformMatrix3fv(locNormalReflect, 1, GL_FALSE, transformPipeLine.GetNormalMatrix());
		glUniformMatrix4fv(locInvertedCamera, 1, GL_FALSE, mInverseCamera);

		glUniform1i(locCubeMap, 0);
		glUniform1i(locTarnishMap, 1);

		glEnable(GL_CULL_FACE);
		sphereBatch.Draw();
		glDisable(GL_CULL_FACE);
	}
	modelViewMatrix.PopMatrix();

	modelViewMatrix.PushMatrix();
	{
		modelViewMatrix.MultMatrix(mCameraRotOnly);
		glUseProgram(skyBoxShader);
		glUniformMatrix4fv(locMVPSkyBox, 1, GL_FALSE, transformPipeLine.GetModelViewProjectionMatrix());
		cubeBatch.Draw();
	}
	modelViewMatrix.PopMatrix();

	glutSwapBuffers();
}

void SpecialKeys(int key, int x, int y)
{
	float linear = 1.0f;
	float angular = float(m3dDegToRad(5.0f));

	if (key == GLUT_KEY_UP)
		viewFrame.MoveForward(linear);

	if (key == GLUT_KEY_DOWN)
		viewFrame.MoveForward(-linear);

	if (key == GLUT_KEY_LEFT)
		viewFrame.RotateWorld(angular, 0.0f, 1.0f, 0.0f);

	if (key == GLUT_KEY_RIGHT)
		viewFrame.RotateWorld(-angular, 0.0f, 1.0f, 0.0f);

	glutPostRedisplay();
}

void ShutdownRC(void)
{
	glDeleteTextures(1, &tarnishTexture);
	glDeleteTextures(1, &cubeTexture);
	glDeleteProgram(reflectionShader);
	glDeleteProgram(skyBoxShader);
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(800, 600);
	glutCreateWindow("OpenGL Cube Maps");
	glutReshapeFunc(ChangeSize);
	glutDisplayFunc(RenderScene);
	glutSpecialFunc(SpecialKeys);

	GLenum err = glewInit();
	if (GLEW_OK != err) {
		fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
		return 1;
	}

	SetupRC();

	glutMainLoop();

	ShutdownRC();

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 21:26:27

OpenGL蓝宝书第七章:立体天空和纹理折射、双纹理(下)的相关文章

OpenGL蓝宝书第六章代码疑虑:为什么使用了GL_TEXTURE_1D??纹理和顶点间的映射是如何实现?

遇到一个大问题,明明加载纹理绑定的是GL_TEXTURE_2D glUniform1i(locCloudTex, 1); //明明默认为0,参数却不是0. 可是原书中代码确是 glGenTextures(1, &uiTexture); glBindTexture(GL_TEXTURE_1D, uiTexture); // LoadTGATexture("Clouds.tga", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); glUniform

OpenGL蓝宝书第五章代码勘误以及惯性坐标系去解释模型变换

如果你也发现按照教程代码完成贴图时,你会底面的坐标和平常顶点坐标正负相反,比如-1.0f, -1.0f, -1.0f这个顶点对应的却是世界坐标中1.0f,-1.0f,1.0f 问题究竟出现在哪里? 原来是:objectFrame.GetCameraMatrix(mObjectFrame); //原书中的代码为GetMatrix,获取了objectFrame的朝向,导致顶点和纹理的对象关系出现了相反内容 objectFrame中的朝向和OpenGL的默认朝向相反,getMatrix的操作会导致mo

OpenGL蓝宝书第五章5.4Tunnuel 纹理映射和过滤:较好的可读性代码

主要处理了纹理贴图和顶点映射的关系.根据法线先确认环绕方向.然后根据绘制的primitive_type完成纹理顶点直接的映射. 哪里来,哪里回:根据法线来确认逆时针方向.strip的画法要熟悉,从其实的两个顶点开始已折线的形式前进 GL_TRIANGLES_STRIP是常用的绘制方式,在循环代码中使用四个顶点+循环控制量能完成大量的几何图形绘制.这里我犯了个错误,没意识到折线的的前进方向问题,导致纹理映射出现了偏差,一度去怀疑modelViewMatrix的配置是否正确.但是我发现原书中的代码没

《机器学习》西瓜书第七章贝叶斯分类器

先验概率:基于已有知识对司机事件进行概率预估,但不考虑任何相关因素. 后验概率:基于已有知识对随机事件进行概率预估,并考虑相关因素P(c|X). 7.1  贝叶斯决策论 贝叶斯决策论是概率框架下实施决策的基本方法.贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记. 在样本x上的“条件风险”: 我们的任务是寻找一个判定准则h:以最小化总体风险   贝叶斯判定准则:为最小化总体风险,只需在每个样本上选择哪个能使条件风险R(c|x)最小的类别标记. h*称为贝叶斯最优分类器,与之对应的总

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 提供ROS接口的3D软件比较多,本章以最典型的Gazebo介绍为主,从Player/Stage/Gazebo发展而来,现在独立的机器人仿真开发环境,目前2016年最新版本Gazebo7.1配合ROS(kinetic)使用. 补充内容:http://blo

Mac OSX下搭建OpenGL超级宝典5(蓝宝书)开发环境(运行第一个三角形程序)

1.下载OpenGL超级宝典5(蓝宝书)的资源,链接如下:http://pan.baidu.com/s/1c02PtYC,解压得到SB5文件夹,里面有书籍的课程源码以及GLTools库. 2.依次点击Xcode-->Preferences-->Locations-->Sources Trees,再点“+”号按钮添加Name:  GLTOOLS_INCLUDE,  Display Name:  GLTools include Folder, Path: ~/Desktop/SB5/src/

Android群英传笔记——第七章:Android动画机制和使用技巧

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动画

[GEiv]第七章:着色器 高效GPU渲染方案

第七章:着色器 高效GPU渲染方案 本章介绍着色器的基本知识以及Geiv下对其提供的支持接口.并以"渐变高斯模糊"为线索进行实例的演示解说. [背景信息] [计算机中央处理器的局限性] 在大学的"数字图像处理"课程中,老师解说了高斯模糊的基本算法.并使用C#进行了基本实现.高斯模糊.简单地说,就是使用高斯权重模板对图像的每个像素进行再计算.填充,以达到模糊的效果. 在课程中.对于给定的模板与模糊度系数,对一副800X600的图像进行模糊处理.须要计算48万个像素点,

[GEiv]第七章:着色器 高效的GPU渲染方案

第七章:着色器 高效的GPU渲染方案 本章介绍着色器的基本知识以及Geiv下对其提供的支持接口,并以"渐变高斯模糊"为线索进行实例的演示讲解. [背景信息] [计算机中央处理器的局限性] 在大学的"数字图像处理"课程中,老师讲解了高斯模糊的基本算法,并使用C#进行了基本实现.高斯模糊,简单地说,就是使用高斯权重模板对图像的每一个像素进行再计算.填充,以达到模糊的效果. 在课程中,对于给定的模板与模糊度系数,对一副800X600的图像进行模糊处理,需要计算48万个像素