实现步骤

第一步:设置所需要的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. 源码安装postgresql数据库

    一般情况下,postgresql由非root用户启动. 1.创建postgres用户 groupadd postgres useradd -g postgres postgres 下面的操作都在pos ...

  2. Oracle基础结构认知—初识oracle【转】

    Oracle服务器(oracle server)由实例和数据库组成.其中,实例就是所谓的关系型数据库管理系统(Relational Database Management System,RDBMS), ...

  3. 畸形的 dockerfile中的COPY命令-

    dockerfile中的COPY是指COPY 指定目录的“子级目录”下所有的目录和文件,到指定目录中,这个shell中的cp命令大相径庭,使得很多人纳闷,怎么cpy过去的文件不是自己想要的

  4. idea中使用tomcat 方式启动spring boot项目

    Spring boot 的main 入口启动方式相信都会用,直接运行main直接就启动了,但是往往这种方式并不是最佳的启动方式,比如运维的层面更希望调整tomcat的调优参数,而只使用嵌入启动方式很难 ...

  5. 随机数生成 && 生成执行锁

    生成随机数列: openssl rand -base64 uuidgen echo $RANDOM | md5sum echo $RANDOM | sha256sum 随机小写10个字母 随机数: [ ...

  6. python操作mysql(pymysql + sqlalchemy)

    pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行sql #!/usr/bi ...

  7. 【Android开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

    广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都 ...

  8. day08作业

    1.A.在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B.在内存中的位置不同 成员变量:在堆内存(成员变量属于对象,对象进堆内存) 局部变量:在栈内存(局部变量属于方 ...

  9. python进阶学习之高阶函数

    高阶函数就是把函数当做参数传递的一种函数, 例如: 执行结果: 1.map()函数 map()接收一个函数 f 和一个list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 l ...

  10. Linux学习笔记:cat、tac、more、less、head、tail查看文件内容

    Linux下查看文件内容可以通过以下命令: cat tac more less head tail nl tailf 1.cat 由第一行开始显示内容,并将所有内容输出.当文件过大时,使用cat查看不 ...