美文网首页
GLFW5 ——纹理应用

GLFW5 ——纹理应用

作者: 偶是星爷 | 来源:发表于2016-08-14 12:56 被阅读325次

纹理是一种GL对象,创建方式与顶点数据类似

    int width_, height_;
    unsigned char* image = SOIL_load_image("container.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);
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    glBindTexture(GL_TEXTURE_2D, 0);

纹理显示到fragment前,还需要设置它的纹理坐标。
纹理坐标和顶点坐标有点不同,它指的是纹理的映射点。纹理像素(Texile)和屏幕像素不是一一对应的

    // Set up vertex data (and buffer(s)) and attribute pointers
    GLfloat vertices[] = {
        //     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -
        0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,
        0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   // 右下
        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // 左下
        -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f,    // 左上
        0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   // 右上
        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // 左下
    };

    GLuint VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    // Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).
    glBindVertexArray(VAO);
    
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);
    
    glVertexAttribPointer(2, 2, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
    glEnableVertexAttribArray(2);
    
    glBindBuffer(GL_ARRAY_BUFFER, 0); // Note that this is allowed, the call to glVertexAttribPointer registered VBO as the currently bound vertex buffer object so afterwards we can safely unbind
    
    glBindVertexArray(0); // Unbind VAO (it's always a good thing to unbind any buffer/array to prevent strange bugs)

这段代码里,我们把顶点位置、颜色、纹理坐标储存在一个VAO中。
shader改变一下,颜色从纹理中采样

#version 330 core
in vec3 ourColor;
out vec4 color;
in vec2 TexCoord;

uniform sampler2D ourTexture;

void main()
{    color = texture(ourTexture, TexCoord);
}

texture函数传入纹理对象和纹理坐标,返回对应点点颜色值!

        glBindTexture(GL_TEXTURE_2D, texture);
                
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 6);
                
        glBindVertexArray(0);

当只有一个纹理时,不需要用glUniform像shader中传值!

相关文章

  • GLFW5 ——纹理应用

    纹理是一种GL对象,创建方式与顶点数据类似 纹理显示到fragment前,还需要设置它的纹理坐标。纹理坐标和顶点坐...

  • (九)纹理

    片段着色器的核心方面时对表面应用纹理。 纹理基础 3D图形渲染中最基本的操作之一时是对一个表面应用纹理。纹理有多种...

  • OpenGL-纹理应用

    纹理坐标 加载纹理只是在几何图形上应用纹理的第一步。最低限度我们必须同时提供纹理坐标,并设置纹理坐标环绕模式和纹理...

  • 纹理的应用

    1.纹理坐标 纹理坐标的范围是0到1的浮点数所组成的三维空间坐标系,每个坐标点对应四个分量,分别为s,t,r,q。...

  • OpenGL ES - 纹理

    纹理 什么是纹理 纹理是一个缓存,用来保存图像的颜色元素值 纹理可以使用任何图像 当纹理应用到图形中,会使渲染场景...

  • 单张纹理_01

    A.单张纹理应用通常使用一张纹理来代替物体的漫反射颜色纹理名_ST表示声明某个纹理的属性,name##_ST.xy...

  • OpenGL ES 纹理绘制

    纹理绘制就是纹理映射,这里有个术语 纹素 ,不是用像素来表示纹理对象中的显示元素,主要是为了强调纹理对象的应用方式...

  • Metal 基础任务和概念 - 06

    创建和采样纹理 将图像数据加载到纹理中并将其应用于四边形 概述 您可以使用纹理在metal中绘制和处理图像。纹理是...

  • 纹理的综合应用

    1. MIP贴图 MIP贴图的产生主要是为了解决渲染时的闪烁和性能耗费的问题,简单来说就是当需要屏幕上只需要处理一...

  • OpenGL 纹理

    纹理常用的函数 纹理只是一种能够应用到场景中的三角形上的图像数据。它经过过滤的纹理单元(texel,相当于基于纹理...

网友评论

      本文标题:GLFW5 ——纹理应用

      本文链接:https://www.haomeiwen.com/subject/houysttx.html