ZBLOG

Ubuntu OpenGL ES实现一个矩形 Shader中v_texCoord赋值的完整代码例子

在Ubuntu上实现一个使用OpenGL ES的矩形,并在着色器中赋值v_texCoord的示例代码如下。这包括了创建顶点和片段着色器,以及设置OpenGL ES的基本框架。假设你已经安装了必要的库,例如 libglfw3-devlibglm-dev

1. 创建顶点和片段着色器

顶点着色器 (vertex shader) - vertex_shader.glsl

#version 300 es
in vec4 a_position; // 输入位置
in vec2 a_texCoord; // 输入纹理坐标

out vec2 v_texCoord; // 输出到片段着色器

void main() {
    gl_Position = a_position; // 设置顶点位置
    v_texCoord = a_texCoord; // 将纹理坐标传递给片段着色器
}

片段着色器 (fragment shader) - fragment_shader.glsl

#version 300 es
precision mediump float;

in vec2 v_texCoord; // 从顶点着色器接收的纹理坐标

uniform sampler2D u_texture; // 纹理采样器
out vec4 fragColor; // 输出颜色

void main() {
    fragColor = texture(u_texture, v_texCoord); // 根据纹理坐标获取颜色并输出
}

2. OpenGL ES 主程序

以下是使用OpenGL ES创建一个矩形并显示纹理的完整C++代码示例:

#include <GLES3/gl32.h>
#include <EGL/egl.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>

GLuint loadShader(GLenum type, const char* source) {
    GLuint shader = glCreateShader(type);
    glShaderSource(shader, 1, &source, nullptr);
    glCompileShader(shader);

    GLint success;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    if (!success) {
        char infoLog[512];
        glGetShaderInfoLog(shader, 512, nullptr, infoLog);
        std::cerr << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    
    return shader;
}

GLuint createProgram(const char* vertexSource, const char* fragmentSource) {
    GLuint vertexShader = loadShader(GL_VERTEX_SHADER, vertexSource);
    GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentSource);
    
    GLuint program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    
    glLinkProgram(program);
    
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    return program;
}

int main() {
    if (!glfwInit()) {
        std::cerr << "Failed to initialize GLFW" << std::endl;
        return -1;
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL ES Rectangle", nullptr, nullptr);
    
    if (!window) {
        std::cerr << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

   glfwMakeContextCurrent(window);

   const char* vertexSource =
       "#version 300 es\n"
       "in vec4 a_position;\n"
       "in vec2 a_texCoord;\n"
       "out vec2 v_texCoord;\n"
       "void main() {\n"
       "   gl_Position = a_position;\n"
       "   v_texCoord = a_texCoord;\n"
       "}";

   const char* fragmentSource =
       "#version 300 es\n"
       "precision mediump float;\n"
       "in vec2 v_texCoord;\n"
       "uniform sampler2D u_texture;\n"
       "out vec4 fragColor;\n"
       "void main() {\n"
       "   fragColor = texture(u_texture, v_texCoord);\n"
       "}";

   GLuint program = createProgram(vertexSource, fragmentSource);

   GLfloat vertices[] = {
      // Position         // TexCoords
      -0.5f, -0.5f,      0.0f, 0.0f,
      0.5f, -0.5f,      1.0f, 0.0f,
      -0.5f, 0.5f ,     0.0f ,1.0f,
      
      -0.5f ,0.5f ,     0.0f ,1.0f,
      0.5f ,-0.5f ,     1.f ,0.f,
      0.5,-1.f          ,1.f ,1.f,
};

GLuint vao;
GLuint vbo;

glGenVertexArrays(1,&vao );
glBindVertexArray(vao );

glGenBuffers(1,&vbo );
glBindBuffer(GL_ARRAY_BUFFER,vbo );
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices ,GL_STATIC_DRAW);

// Position attribute 
glEnableVertexAttribArray(0); 
glVertexAttribPointer( 
    	// attribute index 
    	// size 
    	// type 
    	// normalized? 
    	// stride 
    	// offset 
    
);

// Texture coord attribute 

glEnableVertexAttribArray(1); 
/* Add your Vertex Attrib Pointer for the texture coordinate here */ 

while (!glfwWindowShouldClose(window)) {
   
   /* Rendering commands */
  
}

}


注意事项:

  • 确保你的开发环境中已安装相应的OpenGL ES库和头文件。
  • 此代码示例仅提供基本框架,可能需要根据具体需求调整或补充细节(例如加载纹理、错误处理等)。
  • 着色器路径可以根据需要进行修改,确保其正确。

希望这个示例能帮助你理解如何在OpenGL ES中使用shader进行绘制!如果有进一步问题,请随时问我。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6592

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?