实现步骤

第一步:设置所需要的OpenGL环境

设置上下文环境

删除已经存在的渲染的缓存

设置颜色缓存

设置帧缓存

清除缓存

设置窗口大小

开启功能

编译shander

使用program

获取shader中的属性和uniform索引

第二步:绘制图片

获取图片数据并且的到对应的纹理id

指定纹理,绑定纹理

开始对图形进行渲染

(

启用顶点属性数组纹理坐标,将纹理坐标传递到shader中

启用顶点属性数组顶点坐标,将顶点坐标传递到shader中

启用索引数组

开始绘制

)

解绑纹理

实现

这次实现的过程有些艰难啊,走了很多的弯路,不过也因此学到蛮多的,自己写的怎么都运行不了,但是在别人的基础上运行就不行,其中错误的地方有:1.纹理的数据错误,使用png的库失败;2.绘制函数的参数错误;3.使用新版本的glsl语言版本,但是xcode并不支持,并不熟悉期间的语言版本迭代;

实现代码:

主程序

#include "SOIL.h"

static void error_callback(int error, const char* description)
{
fprintf(stderr, "Error: %s\n", description);
} int main(void)
{
GLFWwindow* window; glfwSetErrorCallback(error_callback); if (!glfwInit())
exit(EXIT_FAILURE); window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
if (!window)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
exit(EXIT_FAILURE);
} glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit(); glfwSwapInterval(1);
glViewport(0, 0, 640, 480); bool ret = getImageData("/Users/staff/Desktop/Moni/Moni/wall.png");
if (!ret) {
cout << "get iamge data is failed." << endl;
}
else {
cout << "get iamge data is success." << endl; //测试图片数据
// FILE * file;
// file = fopen("/Users/staff/Desktop/abc.png","wb");
// if (file)
// {
// fwrite(_sp_image_data.getBytes(),1,_sp_image_data.getSize(), file);
// }
// fclose(file);
} // 第一行和第三行不是严格必须的,默认使用GL_TEXTURE0作为当前激活的纹理单元 /**
* GL_TEXTURE_2D表示操作2D纹理
* 创建纹理对象,
* 绑定纹理对象,
*/
glPixelStorei(GL_UNPACK_ALIGNMENT, 8);
glGenTextures(1, &_sp_textureID);
glBindTexture(GL_TEXTURE_2D, _sp_textureID); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_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 ); /**
* 将图像数据传递给到GL_TEXTURE_2D中, 因其于textureID纹理对象已经绑定,所以即传递给了textureID纹理对象中。
* glTexImage2d会将图像数据从CPU内存通过PCIE上传到GPU内存。
* 不使用PBO时它是一个阻塞CPU的函数,数据量大会卡
*/
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _sp_image_size.getX(), _sp_image_size.getY(), 0, GL_RGBA, GL_UNSIGNED_BYTE, _sp_image_data.getBytes());
// glGenerateMipmap(GL_TEXTURE_2D); int width, height;
unsigned char* image = SOIL_load_image("/Users/staff/Desktop/fgh/fgh/wall.jpg", &width, &height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
SOIL_free_image_data(image); glBindTexture(GL_TEXTURE_2D, 0); _vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(_vertexShader, 1, &CCPositionTextureColorVert, NULL);
glCompileShader(_vertexShader); GLint status;
glGetShaderiv(_vertexShader, GL_COMPILE_STATUS, &status);
if (!status) {
GLint infoLen = 0;
glGetShaderiv(_vertexShader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen) {
char* infoLog = static_cast<char *>(malloc(sizeof(char) * infoLen));
glGetShaderInfoLog(_vertexShader, infoLen, NULL, infoLog);
cout << "compile vert shader wrong..." << infoLog << endl;
}
}
else {
cout << "compile vert shader success..." << endl;
} _fragShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(_fragShader, 1, &CCPositionTextureColorFrag, NULL);
glCompileShader(_fragShader); glGetShaderiv(_fragShader, GL_COMPILE_STATUS, &status);
if (!status) {
GLint infoLen = 0;
glGetShaderiv(_fragShader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen) {
char* infoLog = static_cast<char *>(malloc(sizeof(char) * infoLen));
glGetShaderInfoLog(_fragShader, infoLen, NULL, infoLog);
cout << "compile frag shader wrong..." << infoLog << endl;
}
}
else {
cout << "compile vert frag success..." << endl;
} _program = glCreateProgram();
glAttachShader(_program, _vertexShader);
glAttachShader(_program, _fragShader);
glLinkProgram(_program); glGetProgramiv(_program, GL_LINK_STATUS, &status);
if (status == GL_FALSE) {
GLint infoLen = 0;
glGetProgramiv(_program, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen) {
char* infoLog = static_cast<char *>(malloc(sizeof(char) * infoLen));
glGetProgramInfoLog(_program, infoLen, NULL, infoLog);
cout << "link program wrong..." << infoLog << endl;
}
}
else {
cout << "the program link success." << endl;
} //设置顶点数据(和缓冲)和属性指针
GLfloat vertices[] = {
// Positions // Colors // Texture Coords
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 0.1f,
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.8f,
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.8f,
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.5f, 0.1f
};
GLuint indices[] = {
0, 1, 3,
1, 2, 3
}; GLuint VBO, VAO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); GLuint _positionSlot = glGetAttribLocation(_program, "position");
GLuint _colorSlot = glGetAttribLocation(_program, "color");
GLuint _textureCoordsSlot = glGetAttribLocation(_program, "texCoord");
//GLuint _textureSlot = glGetUniformLocation(shader.program, "ourTexture"); glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(_positionSlot); glVertexAttribPointer(_colorSlot, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(_colorSlot); glVertexAttribPointer(_textureCoordsSlot, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
glEnableVertexAttribArray(_textureCoordsSlot); glBindVertexArray(0); while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); //use
glUseProgram(_program); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _sp_textureID); // 绑定,即可从_textureID中取出图像数据
glUniform1i(glGetUniformLocation(_program, "ourTexture1"), 0); //draw
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0); glfwPollEvents();
glfwSwapBuffers(window);
} glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO); glfwDestroyWindow(window); glfwTerminate();
exit(EXIT_SUCCESS);
}

上面是主程序的代码,除了这个,还需要顶点shader和片元shader;其实这里有个坑,就是glsl的语言版本,越望越后面,增加了更多的新 功能,导致我不认识,从而使用了新版本的,同时xcode只更新了到了2.0上,其他版本在xcode并不能使用,因此导编编译失败。

先是顶点shader:

const char* CCPositionTextureColorVert = STRINGIFY(
attribute vec3 position;
attribute vec3 color;
attribute vec2 texCoord; varying vec3 ourColor;
varying vec2 TexCoord; void main() {
gl_Position = vec4(position, 1.0);
ourColor = color;
TexCoord = texCoord;
}
);

接下来的是片元shader

const char* CCPositionTextureColorFrag = STRINGIFY(
varying vec3 ourColor;
varying vec2 TexCoord; //varying vec4 color; uniform sampler2D ourTexture1;
uniform sampler2D ourTexture2;
uniform float mixValue; void main() {
gl_FragColor = mix(texture2D(ourTexture1, TexCoord) * vec4(ourColor, 1.0), texture2D(ourTexture2, vec2(-TexCoord.x, TexCoord.y)), mixValue);
}
);

[OpenGL]纹理贴图实现 总结的更多相关文章

  1. OpenGL 纹理贴图

    前一节实例代码中有个贴图操作. 今天就简单说明一下纹理贴图... 为了使用纹理贴图.我们首先需要启用纹理贴图功能. 我们可以在Renderer实现的onSurfaceCreated中定义启用: // ...

  2. Qt5.6.0+OpenGL 纹理贴图首战告捷

    重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效 Display.h #ifndef DISPLAYWIDGET_H # ...

  3. 用OpenGL进行立方体表面纹理贴图

    一.目的 掌握OpenGL中纹理对象的创建.绑定与使用方法. 二.简单介绍 1,连接静态库 #pragma comment(lib, "glut32.lib") #pragma c ...

  4. opengl学习笔记(三):经过纹理贴图的棋盘

    opengl纹理贴图的步骤: 1:创建纹理对象,并为它指定一个纹理 2:确定纹理如何应用到每个像素上 3:启用纹理贴图功能 4:绘制场景,提供纹理坐标和几何图形坐标 注意:纹理坐标必须在RGBA模式下 ...

  5. IOS 中openGL使用教程3(openGL ES 入门篇 | 纹理贴图(texture)使用)

    在这篇文章中,我们将学习如何在openGL中使用纹理贴图. penGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类.由于本文将以一张图片为例,因此我们为我们的纹理对象 ...

  6. android ndk调用OpenGL 实现纹理贴图Texture

    android ndk调用OpenGL 实现纹理贴图Texture 时间 2014-06-25 05:24:39  CSDN博客 原文  http://blog.csdn.net/chrisfxs/a ...

  7. Android OpenGL ES 开发(九): OpenGL ES 纹理贴图

    一.概念 一般说来,纹理是表示物体表面的一幅或几幅二维图形,也称纹理贴图(texture).当把纹理按照特定的方式映射到物体表面上的时候,能使物体看上去更加真实.当前流行的图形系统中,纹理绘制已经成为 ...

  8. OpenGL——OpenCV与SOIL读取图片进行纹理贴图

    使用OpenCV读取图片代码如下 img = imread(m_fileName); if (img.empty()) { fprintf(stderr, "Can not load ima ...

  9. opengl学习笔记(四):openCV读入图片,openGL实现纹理贴图

    在opengl中实现三维物体的纹理贴图的第一步就是要读入图片,然后指定该图片为纹理图片. 首先利用opencv的cvLoadImage函数把图像读入到内存中 img = cvLoadImage(); ...

随机推荐

  1. JDK1.8源码之String

    一.String类型 引用博文连接:  https://blog.csdn.net/ylyg050518/article/details/52352993 一.成员变量 //用于存储字符串 priva ...

  2. Virut样本取证特征

    1.网络特征 ant.trenz.pl ilo.brenz.pl 2.文件特征 通过对文件的定位,使用PEID查看文件区段,如果条件符合增加了7个随机字符区段的文件,则判定为受感染文件. 3.受感染特 ...

  3. Shell-判断条件总结

    -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目录,则为真 -e file 若文件存在,则为真 -f ...

  4. MySQL分布式集群之MyCAT(三)rule的分析【转】

    首先写在最前面,MyCAT1.4的alpha版本已经发布了,这里面修复了不少的bug,也完善了一细节,之前两篇博客已经做了一些修改 ---------------------------------- ...

  5. innobackupex 相关语法讲解【转】

    innobackupex 相关语法讲解 连接服务器 The database user used to connect to the server and its password are speci ...

  6. 十一、springcloud之链路追踪Sleuth

    一.背景 随着微服务的数量增长,一个业务接口涉及到多个微服务的交互,在出错的情况下怎么能够快速的定位错误 二.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...

  7. Linux入门(一)root密码设置和用户切换

    从这学期开始,本人将会亲自开一个Linux 专题学习包括Linux 常用命令,常见问题的一些解决方法,以及Linux系统下C和C++一些学习经验 下面这张图片是首次安装Ubuntu后第一次设置root ...

  8. MySQL学习笔记:计算机服务中找不到MySQL服务

    不知道什么原因,连接了远程服务器之后,本地服务就连接不上. 经排查,发现服务中的MySQL服务居然不见,一番搜索之后,在CMD中进入到MySQL安装目录的bin下执行以下语句: mysqld.exe ...

  9. ASP.NET MVC之验证终结者篇

    有时候我觉得,很多人将一个具体的技术细节写的那么复杂,我觉得没有必要,搞得很多人一头雾水的,你能教会别人用就成了,具体的细节可以去查MSDN什么的,套用爱因斯坦的名言:能在网上查到的就不要去记,用的时 ...

  10. Python全栈开发之目录

    基础篇 Python全栈开发之1.输入输出与流程控制 Python全栈开发之2.运算符与基本数据结构 Python全栈开发之3.数据类型set补充.深浅拷贝与函数 Python全栈开发之4.内置函数. ...