跟我一起学OpenGL- texture(纹理)

2024-02-17 10:20
文章标签 opengl 一起 纹理 texture

本文主要是介绍跟我一起学OpenGL- texture(纹理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面学习了画普通的图形,但是颜色比较单一,有什么好的方法让图形颜色更加丰富,更加真实呢?texture(中文译为纹理)就可以扮演这一角色,本节则简单说明texture的使用。

运行下面的程序,便可出现一个黑白相间的棋盘:

  1 #include <GL/glew.h>                                                                                                                                                                                        2 #include <GL/freeglut.h>3 #include <iostream>4 using namespace std;5 #define BUFFER_OFFSET(x) ((const void*) (x))67 enum VAO_IDs {Triangles, NumVAOs};8 enum Buffer_IDs {ArrayBuffer, NumBuffers};9 enum Attrib_IDs {vPosition = 0};1011 GLuint VAOs[NumVAOs];12 GLuint Buffers[NumBuffers];13 GLuint program;1415 GLushort indices[] = {16         0, 1, 3, /* first triangle */17         1, 2, 3 /* second triangle */18 };1920 GLuint tex;2122 const GLchar* vertex_shader = "#version 300 es \n"23                               "layout(location=0) in vec3 vPosition;\n"24                               "layout(location=1) in vec2 texCo;\n"25                               "out vec2 TexC;\n"26                               "void main()\n"27                               "{\n"28                               "gl_Position = vec4(vPosition, 1.0);\n"29                               "TexC = vec2(texCo.x, texCo.y);\n"30                               "}\n";3132 const GLchar* fragment_shader = "#version 300 es \n"33                                 "precision highp float; \n"34                                 "uniform sampler2D color;\n"35                                 "layout(location=0)out vec4 fColor;\n"36                                 "in vec2 TexC;\n"37                                 "void main()\n"38                                 "{\n"39                                 "fColor = texture2D(color, TexC);\n"40                                 "}\n";4142 void init_shader()43 {44           // vertex shader45           GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);46           glShaderSource(vertexShader, 1, &vertex_shader, NULL);47           glCompileShader(vertexShader);48           // check vertex shader compiling status49           GLint compiled;50           GLchar log[256];51           glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled);52           if (!compiled)53           {54                   glGetShaderInfoLog(vertexShader, 256, NULL, log);55                   std::cerr << "vertex shader compile failed" << log << std::endl;56           }5758           // fragment shader59           GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);60           glShaderSource(fragmentShader, 1, &fragment_shader, NULL);61           glCompileShader(fragmentShader);62           // check fragment shader compiling status63           glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled);64           if (!compiled)65           {66                   glGetShaderInfoLog(fragmentShader, 256, NULL, log);67                   std::cerr << "fragment shader compile failed" << log << std::endl;68           }6970           // link shaders71           program = glCreateProgram();72           glAttachShader(program, vertexShader);73           glAttachShader(program, fragmentShader);74           glLinkProgram(program);7576           cout << "prog=" << program << endl;77           //check link status78           GLint linked;79           glGetProgramiv(program, GL_LINK_STATUS, &linked);80           if (!linked)81           {82                   glGetProgramInfoLog(program, 256, NULL, log);83                   std::cerr << "shader linking failed" << log << std::endl;84           }85           // delete shader86           glDeleteShader(vertexShader);87           glDeleteShader(fragmentShader);88 }8990 #define HEIGHT 891 #define WIDTH 892 unsigned char pic[HEIGHT][WIDTH][4];9394 static void gen_texture(void)95 {96         int i, j, count;97         for(i = 0; i < HEIGHT; i++)98         {99                 for(j = 0; j < WIDTH; j++)
100                 {
101                         count = (((i & 0x1) == 0) ^ ((j & 0x1) == 0)) * 255;
102                         pic[i][j][0] = count;
103                         pic[i][j][1] = count;
104                         pic[i][j][2] = count;
105                         pic[i][j][3] = 255;
106                 }
107         }
108 }
109
110 void init_data()
111 {
112           glClearColor(0, 0, 0, 0);
113           glClear(GL_COLOR_BUFFER_BIT);
114
115           gen_texture();
116
117           glGenVertexArrays(NumVAOs, VAOs);
118           glBindVertexArray(VAOs[Triangles]);
119
120           const GLfloat vertices[] = {
121                 // positions     
122                  -1.0f,  -1.0f, 0.0f,     // top right
123                  1.0f, -1.0f, 0.0f,       // bottom right
124                  1.0f, 1.0f, 0.0f,        // bottom left
125                 -1.0f,  1.0f, 0.0f,       // top left
126
127                 // texture coords
128                 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f
129          };
130
131          glGenBuffers(NumBuffers, Buffers);
132          glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
133          glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
134
135          GLuint ebo;
136          glGenBuffers(1, &ebo);
137          glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
138          glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
139
140          glGenTextures(1, &tex);
141          glBindTexture(GL_TEXTURE_2D, tex);
142
143          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
144          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
145
146          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
147          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
148          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, pic);
149
150          glUseProgram(program);
151
152          GLint texloc = glGetAttribLocation(program, "texCo");
153          cout << "texloc=" << texloc << endl;
154          GLint posloc = glGetAttribLocation(program, "vPosition");
155          cout << "posloc=" << posloc << endl;
156
157          glEnableVertexAttribArray(posloc);
158          glVertexAttribPointer(posloc, 3, GL_FLOAT, GL_FALSE, 0, 0);
159
160          glEnableVertexAttribArray(texloc);
161          glVertexAttribPointer(texloc, 2, GL_FLOAT, GL_FALSE, 0, (void*)(12*sizeof(float)));
162 }
163
164 void display()
165 {
166         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
167         glFlush();
168 }
169
170 int main(int argc, char* argv[])
171 {
172          glutInit(&argc, argv);
173          glutInitDisplayMode(GLUT_RGBA);
174          glutInitWindowSize(300 ,300);
175          glutInitWindowPosition(100, 100);
176          glutCreateWindow("Learn opengl: texture");
177
178          const char* version = (const char*)glGetString(GL_VERSION);
179          cout << "version=" << version << endl;
180          const char* vendor = (const char*)glGetString(GL_VENDOR);
181          cout << "vendor=" << vendor << endl;
182
183          const char* render = (const char*)glGetString(GL_RENDERER);
184          cout << "render=" << render << endl;
185
186          const char* extension = (const char*)glGetString(GL_EXTENSIONS);
187          cout << "extension=" << extension << endl;
188
189          glewExperimental = GL_TRUE;
190          if(glewInit())
191          {
192                  std::cout << "Unable to Initialize" << std::endl;
193                  exit(1);
194          }
195          init_shader();
196          init_data();
197          glutDisplayFunc(display);
198          glutMainLoop();
199 }

如图所示:

上面的程序会产生8x8大小的texture,黑白相间。

这篇关于跟我一起学OpenGL- texture(纹理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717470

相关文章

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

社交平台找旅游搭子一起旅行靠谱吗?答案是不要太爽!

哈喽小伙伴们,今天要跟大家分享一个超级棒的小程序——咕哇找搭子!作为一个热爱自由行的人,最头疼的就是找不到志同道合的小伙伴。但自从用了这个咕哇小程序后,一切都变得简单又充满乐趣啦!🎉 上个月,我计划去云南旅行,就试着在咕哇上发布了我的行程信息。没想到很快就收到了几位朋友的回应,其中一位叫小莲的朋友特别投缘。我们不仅目的地一样,就连兴趣爱好都出奇地相似,于是我们就决定一起出发啦!👭

试用GLFW并创建OpenGL和DX的环境

介绍GLFW GLFW官网:https://www.glfw.org/ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contex