GLSL 纹理贴图
#include <ork/render/FrameBuffer.h>
#include <ork/scenegraph/SceneManager.h>
#include <ork/ui/GlutWindow.h>
#include <pmath.h>
#include <stbi/stb_image.h>
#include <iostream>
#include <fstream> const unsigned char * loadfile(const std::string &file, int &size)
{
std::ifstream fs(file.c_str(), std::ios::binary);
fs.seekg(, std::ios::end);
size = fs.tellg();
char * data = new char[size + ];
fs.seekg();
fs.read(data, size);
fs.close();
data[size] = ;
return (unsigned char *)data;
} struct P3_UV
{
float _x, _y, _z;
float _u, _v;
P3_UV()
{ }
P3_UV(float x, float y, float z, float u, float v)
:_x(x),_y(y),_z(z),_u(u),_v(v)
{ } };
class TestWindow : public ork::GlutWindow
{
public:
TestWindow()
:ork::GlutWindow(ork::Window::Parameters().name("ProlandTerrain").size(, ))
,_dist(2.0)
{
_mesh = new ork::Mesh<P3_UV, unsigned int>(ork::TRIANGLES, ork::GPU_STATIC);
_mesh->addAttributeType(, , ork::A32F, false);
_mesh->addAttributeType(, , ork::A32F, true); _mesh->addVertex(P3_UV(-, -, , , ));
_mesh->addVertex(P3_UV(, -, , , ));
_mesh->addVertex(P3_UV(, , , , ));
_mesh->addVertex(P3_UV(-, , , , )); _mesh->addIndice();
_mesh->addIndice();
_mesh->addIndice();
_mesh->addIndice();
_mesh->addIndice();
_mesh->addIndice();
int w;
int h;
int channels;
int size;
const unsigned char * data = loadfile("D:/1.jpg", size);
const unsigned char * logo = stbi_load_from_memory(data, size, &w, &h, &channels, ); ork::ptr<ork::Texture2D> texture2D = new ork::Texture2D(w, h, ork::RGB32F, ork::TextureFormat::RGB, ork::ORK_UNSIGNED_BYTE, ork::Texture::Parameters().mag(ork::NEAREST), ork::Buffer::Parameters(), ork::CPUBuffer(logo));
ork::ptr<ork::Module> meshModule = new ork::Module(, "\
uniform mat4 localToScreen; \n\
layout(location = ) in vec3 vertex; \n\
layout(location = ) in vec2 uv; \n\
out vec2 fuv; \n\
void main() { \n\
fuv = uv; \n\
gl_Position = localToScreen * vec4(vertex, 1.0); \n\
} \n\
", "\
uniform sampler2D sampler; \n\
layout(location = ) out vec4 data; \n\
in vec2 fuv; \n\
void main() { \n\
data = vec4(texture(sampler, fuv).rgb, ); \n\
} \n\
");
_meshProgram = new ork::Program(meshModule);
_localToScreen = _meshProgram->getUniformMatrix4f("localToScreen");
_meshProgram->getUniformSampler("sampler")->set(texture2D);
_frameBuffer = ork::FrameBuffer::getDefault();
_frameBuffer->setClearColor(ork::vec4f(0.0, 0.0, 1.0, 1.0));
_frameBuffer->setDepthTest(true, ork::LESS); } virtual void redisplay(double t, double dt)
{
_frameBuffer->clear(true, false, true);
static float i = 0.0;
ork::mat4f cameraToWorld = ork::mat4f::rotatey(i);
i += 0.01;
cameraToWorld = cameraToWorld * ork::mat4f::translate(ork::vec3f(0.0, 0.0, _dist));
ork::mat4f worldToCamera = cameraToWorld.inverse();
ork::vec4<int> vp = _frameBuffer->getViewport();
float width = float(vp.z);
float height = float(vp.w);
ork::mat4f cameraToScreen = ork::mat4f::perspectiveProjection(degrees(45.0), width/height, 0.1, 100000.0);
_localToScreen->setMatrix(cameraToScreen * worldToCamera);
_frameBuffer->draw(_meshProgram, *_mesh);
ork::GlutWindow::redisplay(t, dt);
} virtual void reshape(int x, int y)
{
_frameBuffer->setViewport(ork::vec4i(, , x, y));
ork::GlutWindow::reshape(x, y);
idle(false);
}
public:
static ork::static_ptr<ork::Window> _app;
ork::ptr<ork::FrameBuffer> _frameBuffer;
ork::ptr<ork::Mesh<P3_UV, unsigned int> > _mesh;
ork::ptr<ork::Program> _meshProgram;
ork::ptr<ork::UniformMatrix4f> _localToScreen;
float _dist;
}; ork::static_ptr<ork::Window> TestWindow::_app; int main()
{
atexit(ork::Object::exit);
TestWindow::_app = new TestWindow;
TestWindow::_app->start();
return EXIT_SUCCESS;
}
GLSL 纹理贴图的更多相关文章
- GLSL纹理贴图 【转】
转载:http://blog.csdn.net/hgl868/article/details/7872466 简单的纹理贴图(Simple Texture) 为了在GLSL中应用纹理,我们需要访问每个 ...
- 【GLSL教程】(八)纹理贴图 【转】
http://blog.csdn.net/racehorse/article/details/6664717 简单的纹理贴图(Simple Texture) 为了在GLSL中应用纹理,我们需要访问每个 ...
- 关于OpenGL+GLSL深度贴图采样
作者:Nin+.Lee 邮箱:lilei9110@gmail.com * 本文属原创,转载请注明出处. 在GLSL中,存在着sampler2D和sampler2DShadow两种2D贴图采样器.在对一 ...
- Android OpenGL ES 开发(九): OpenGL ES 纹理贴图
一.概念 一般说来,纹理是表示物体表面的一幅或几幅二维图形,也称纹理贴图(texture).当把纹理按照特定的方式映射到物体表面上的时候,能使物体看上去更加真实.当前流行的图形系统中,纹理绘制已经成为 ...
- (转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片
转:http://blog.csdn.net/junzia/article/details/52842816 前面几篇博客,我们将了Android中利用OpenGL ES 2.0绘制各种形体,并在上一 ...
- [Unity] Shader(着色器)之纹理贴图
在Shader中,我们除了可以设定各种光线处理外,还可以增加纹理贴图. 使用 settexture 命令可以为着色器指定纹理. 示例代码: Shader "Sbin/ff2" { ...
- IOS 中openGL使用教程3(openGL ES 入门篇 | 纹理贴图(texture)使用)
在这篇文章中,我们将学习如何在openGL中使用纹理贴图. penGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类.由于本文将以一张图片为例,因此我们为我们的纹理对象 ...
- Unity3D ShaderLab压缩混合纹理贴图
Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...
- OpenGL 纹理贴图
前一节实例代码中有个贴图操作. 今天就简单说明一下纹理贴图... 为了使用纹理贴图.我们首先需要启用纹理贴图功能. 我们可以在Renderer实现的onSurfaceCreated中定义启用: // ...
随机推荐
- Vim扩展YouCompleteMe插件
在Vim中安装YouCompleteMe插件 一.安装前的说明: 1.确保vim版本>=7.4,若MAC OS,建议直接安装MacVim(8.0版本). ps:如果不想使用MacVim的GUI, ...
- kworker
通过 ps 命令查看进程状态时,可以查看到kworker相关, 大部分格式都是 kworker /u2:0 或者 kworker /0:0H, 查看资料得知: 内核中有很多kworker,有绑定c ...
- Web Scraper使用
{ "selectors": [{ "parentSelectors": ["_root"], "type": &quo ...
- 单向链表仿LinkedList
public class ChainTable { private Node firstNode;//第一个节点 private Node lastNode;//最后一个节点 private int ...
- DFS - leetcode [深度优先遍历]
最短路径=>BFS 所有路径=>DFS 126. Word Ladder II BFS+DFS: BFS找出下一个有效的word进队 并记录step 更新两个变量:unordered ...
- 利用requestjs优化响应式移动端js加载
html: <script data-main="main" src="require.js"></script> main.js re ...
- PHP程序员的技术成长规划(转)
按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...
- HDOJ-1051 Wooden sticks(贪心)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Mac终端命令收集
一.利用命令行执行文件 cd到要执行文件的文件夹 输入python xx.py 命令即可(xx表示要执行的文件名称)
- codefirst mvc Self referencing loop detected for property
登录时,json序列化用户类时提示错误"Self referencing loop detected for property--",经过5个小时的查找,发现原因可能是,用户类包含 ...