ZBLOG

VAO、VBO 和 EBO,并使用 glDrawElements 来渲染四个矩形(两个三角形)

要使用 VAO、VBO 和 EBO 渲染四个矩形(每个矩形由两个三角形组成),我们需要设置顶点数据和索引数据。下面是一个完整的 OpenGL 示例,展示如何进行这些操作。

代码示例

以下是完整的代码示例,演示了如何创建并渲染四个矩形,每个矩形都是由两个三角形组成。

#include <glad/glad.h> // 包含 glad 头文件
#include <GLFW/glfw3.h>
#include <iostream>

// 定义窗口大小
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

// 顶点着色器源代码
const char* vertexShaderSource = R"(
#version 330 core
layout(location = 0) in vec3 aPos; // 顶点位置属性
layout(location = 1) in vec3 aColor; // 顶点颜色属性

out vec3 ourColor; // 输出颜色到片段着色器

void main() {
    gl_Position = vec4(aPos, 1.0); // 设置顶点位置
    ourColor = aColor; // 将颜色传递给片段着色器
}
)";

// 片段着色器源代码
const char* fragmentShaderSource = R"(
#version 330 core
in vec3 ourColor; // 从顶点着色器接收颜色

out vec4 FragColor; // 输出的片段颜色

void main() {
    FragColor = vec4(ourColor, 1.0); // 设置输出颜色为输入颜色,alpha 通道设为 1.0(不透明)
}
)";

int main() {
    // 初始化 GLFW 和设置版本
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // 创建窗口并创建 OpenGL 上下文
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Render Rectangles", NULL, NULL);
    if (window == NULL) {
        std::cout << "Failed to create GLFW window" << std::endl;
        return -1;
    }
    glfwMakeContextCurrent(window);

    // 加载 OpenGL 函数指针
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    // 编译顶点着色器和片段着色器并链接程序
    unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);

    unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);

    unsigned int shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);

	// 删除着色器,因为它们已经链接到程序中,不再需要。
	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);

	// 定义四个矩形的顶点和对应的颜色 (8 个三角形)
	float vertices[] = {
		// 矩形一 (左上)
		-0.9f, -0.9f, 0.0f,   1.0f, 0.0f, 0.0f,
		 0.9f, -0.9f , .00 ,   .95 , .99 , .01,
		 .90 , .90 , .00 ,   .00 , .99 , .01,
		-00.f , .90 , .00 ,   ..5 ,.5 ,.5 ,
		
        // 矩形二 (右上)
	    -.9,-.10,.000,.500,.4997,.17,
	    -.,-.,-.35,-099,-00970.
        
         ...

	};

	unsigned int indices[] = {
    	// 第一个矩形,由两个三角形组成:
    	0, 1, 2,
    	2, 3, 0,

    	// 第二个矩形,由两个三角形组成:
    	4 + count_offset_6_indices,
    	count_of_vertices[index].
         ...
   
};

    
      
    

   

  

     
// 创建 VAO、VBO 和 EBO 并绑定数据  
GLuint VAO,VBO,EBO;
glGenVertexArrays(1,&VAO); 
glGenBuffers(1,&VBO); 
glGenBuffers(1,&EBO);

//绑定 VAO 
glBindVertexArray(VAO);

// 将数据传输到 VBO  
glBindBuffer(GL_ARRAY_BUFFER,VBO); 
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices.GL_STATIC_DRAW);

// 将元素传输到 EBO  
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices.GL_STATIC_DRAW);

// 设置顶点属性指针 (位置)  
glVertexAttribPointer(                                   Gluint index,unsigned size,type normalize stride ptr add offset  
                         ... )
         
              ...    
             
              
              ...
              ..
           ..          
         //
   

             ..
         

  
   ;;

 



   

    
       
      }           

               }        
} 

     

while(!shouldClose){ 
   
         
           
       gllClear();

      `clClearFlags`
      
      $;;
    
           
           '...
                Draw things
        
       
              
           );
            
      ... 
  
   
}

注意事项

在这个示例中,我们为每个矩形定义了四个顶点,以及相应的索引。您可以根据需要调整这些坐标以改变矩形的位置或大小。

确保在实现该程序之前已安装并配置好适用于您的开发环境的 OpenGL 和相关库。如果有其他问题或者具体细节想要了解,请随时提问!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?