[opengl3.x] OVA,OBA,Shader绘制爱心

阅读: 评论:0

[opengl3.x] OVA,OBA,Shader绘制爱心

[opengl3.x] OVA,OBA,Shader绘制爱心

目录

0. heart_data.py

2. shader.cpp

3. shader.hpp

4. ColorFragmentShader.fragmentshader

5. TransformVertexShader.vertexshader


python数据离散化脚本:

0. heart_data.py

import numpy as np
import randomif __name__ == "__main__":heart_list = []anchor = -10for t in [i for i in range(-10, +10)]:x=16*np.sin(t)**3y=s(t)-s(2*t)-s(3*t)-np.cos(4*t)heart_list.append([0, np.round(x/10, 2), np.round(y/10, 2)])# random.shuffle(heart_list)for ele in heart_list:print("        {z}, {x}, {y},".format(x = ele[0], y = ele[1], z = ele[2]))

得到心形离散点坐标:

        -1.26, 0, 0.26,-1.44, 0, -0.11,0.12, 0, -1.55,1.12, 0, -0.45,0.65, 0, 0.03,0.9, 0, 1.41,-0.85, 0, 0.69,-1.67, 0, -0.0,-0.39, 0, -1.2,1.17, 0, -0.95,0.5, 0, 0.0,1.17, 0, 0.95,-0.39, 0, 1.2,-1.67, 0, 0.0,-0.85, 0, -0.69,0.9, 0, -1.41,0.65, 0, -0.03,1.12, 0, 0.45,0.12, 0, 1.55,-1.44, 0, 0.11,

Opengl绘制: 

1. main.cpp

// mian.cpp
// Include standard headers
#include <stdio.h>
#include <stdlib.h>// Include GLEW
#include <GL/glew.h>// Include GLFW
#include <GLFW/glfw3.h>
GLFWwindow* window;// Include GLM
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
using namespace glm;#include <common/shader.hpp>int main( void )
{// Initialise GLFWif( !glfwInit() ){fprintf( stderr, "Failed to initialize GLFWn" );getchar();return -1;}glfwWindowHint(GLFW_SAMPLES, 4);glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be neededglfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// Open a window and create its OpenGL contextwindow = glfwCreateWindow( 1024, 768, "Tutorial 04 - Colored Cube", NULL, NULL);if( window == NULL ){fprintf( stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.n" );getchar();glfwTerminate();return -1;}glfwMakeContextCurrent(window);// Initialize GLEWglewExperimental = true; // Needed for core profileif (glewInit() != GLEW_OK) {fprintf(stderr, "Failed to initialize GLEWn");getchar();glfwTerminate();return -1;}// Ensure we can capture the escape key being pressed belowglfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);// Dark blue backgroundglClearColor(0.0f, 0.0f, 0.4f, 0.0f);// Enable depth testglEnable(GL_DEPTH_TEST);// Accept fragment if it closer to the camera than the former oneglDepthFunc(GL_LESS); GLuint VertexArrayID;glGenVertexArrays(1, &VertexArrayID);glBindVertexArray(VertexArrayID);// Create and compile our GLSL program from the shadersGLuint programID = LoadShaders( "TransformVertexShader.vertexshader", "ColorFragmentShader.fragmentshader" );// Get a handle for our "MVP" uniformGLuint MatrixID = glGetUniformLocation(programID, "MVP");// Projection matrix : 45?Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units// glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 4.0f / 3.0f, 0.1f, 100.0f);glm::mat4 Projection = glm::perspective(glm::radians(45.0f), 4.0f / 3.0f, 0.1f, 100.0f);// Camera matrixglm::mat4 View       = glm::lookAt(glm::vec3(0,10,-5), // Camera is at (4,3,-3), in World Spaceglm::vec3(0,0,0), // and looks at the originglm::vec3(+1,0,0)  // Head is up (set to 0,-1,0 to look upside-down));// Model matrix : an identity matrix (model will be at the origin)glm::mat4 Model      = glm::mat4(1.0f);// Our ModelViewProjection : multiplication of our 3 matricesglm::mat4 MVP        = Projection * View * Model; // Remember, matrix multiplication is the other way around// Our vertices. Tree consecutive floats give a 3D vertex; Three consecutive vertices give a triangle.// A cube has 6 faces with 2 triangles each, so this makes 6*2=12 triangles, and 12*3 verticesstatic const GLfloat g_vertex_buffer_data[] = { -1.26, 0, 0.26,-1.44, 0, -0.11,0.12, 0, -1.55,1.12, 0, -0.45,0.65, 0, 0.03,0.9, 0, 1.41,-0.85, 0, 0.69,-1.67, 0, -0.0,-0.39, 0, -1.2,1.17, 0, -0.95,0.5, 0, 0.0,1.17, 0, 0.95,-0.39, 0, 1.2,-1.67, 0, 0.0,-0.85, 0, -0.69,0.9, 0, -1.41,0.65, 0, -0.03,1.12, 0, 0.45,0.12, 0, 1.55,-1.44, 0, 0.11,};// One color for each vertex. They were generated randomly.static const GLfloat g_color_buffer_data[] = { // 0, 1, 0  绿色1, 0, 0,  // 红色// 0, 0, 1  蓝色// 0.33, 0.25, 0.27 // 极客黑0.95, 0.62, 0.76 // 粉色/*0.583f,  0.771f,  0.014f,0.609f,  0.115f,  0.436f,0.327f,  0.483f,  0.844f,0.822f,  0.569f,  0.201f,0.435f,  0.602f,  0.223f,0.310f,  0.747f,  0.185f,0.597f,  0.770f,  0.761f,0.559f,  0.436f,  0.730f,0.359f,  0.583f,  0.152f,0.483f,  0.596f,  0.789f,0.559f,  0.861f,  0.639f,0.195f,  0.548f,  0.859f,0.014f,  0.184f,  0.576f,0.771f,  0.328f,  0.970f,0.406f,  0.615f,  0.116f,0.676f,  0.977f,  0.133f,0.971f,  0.572f,  0.833f,0.140f,  0.616f,  0.489f,0.997f,  0.513f,  0.064f,0.945f,  0.719f,  0.592f,0.543f,  0.021f,  0.978f,0.279f,  0.317f,  0.505f,0.167f,  0.620f,  0.077f,0.347f,  0.857f,  0.137f,0.055f,  0.953f,  0.042f,0.714f,  0.505f,  0.345f,0.783f,  0.290f,  0.734f,0.722f,  0.645f,  0.174f,0.302f,  0.455f,  0.848f,0.225f,  0.587f,  0.040f,0.517f,  0.713f,  0.338f,0.053f,  0.959f,  0.120f,0.393f,  0.621f,  0.362f,0.673f,  0.211f,  0.457f,0.820f,  0.883f,  0.371f,0.982f,  0.099f,  0.879f*/};GLuint vertexbuffer;glGenBuffers(1, &vertexbuffer);glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);GLuint colorbuffer;glGenBuffers(1, &colorbuffer);glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);do{// Clear the screenglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Use our shaderglUseProgram(programID);// Send our transformation to the currently bound shader, // in the "MVP" uniformglUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);// 1rst attribute buffer : verticesglEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);glVertexAttribPointer(0,                  // attribute. No particular reason for 0, but must match the layout in the shader.3,                  // sizeGL_FLOAT,           // typeGL_FALSE,           // normalized?0,                  // stride(void*)0            // array buffer offset);// 2nd attribute buffer : colorsglEnableVertexAttribArray(1);glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);glVertexAttribPointer(1,                                // attribute. No particular reason for 1, but must match the layout in the shader.3,                                // sizeGL_FLOAT,                         // typeGL_FALSE,                         // normalized?0,                                // stride(void*)0                          // array buffer offset);// Draw the triangle !// 改为画线// 常用的类型:// GL_POINTS,GL_LINES,GL_LINE_LOOP, GL_LINE_STRPE,GL_TRIANGLES// GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN// glDrawArrays(GL_TRIANGLES, 0, 12*3); // 12*3 indices starting at 0 -> 12 triangles// 查了一些资料// glDrawArrays(GL_LINES, 0, 10000) GL_LINES表示这次是画线,就是从posArray中两个两个取点画线// 0表示从posArray第一个点画前,当然你也可以从第n个点画起// 10000表示要画多少个点// glDrawArrays(GL_LINE_LOOP, 0, 20);glDrawArrays(GL_TRIANGLE_FAN, 0, 30);glDisableVertexAttribArray(0);glDisableVertexAttribArray(1);// Swap buffersglfwSwapBuffers(window);glfwPollEvents();} // Check if the ESC key was pressed or the window was closedwhile( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&glfwWindowShouldClose(window) == 0 );// Cleanup VBO and shaderglDeleteBuffers(1, &vertexbuffer);glDeleteBuffers(1, &colorbuffer);glDeleteProgram(programID);glDeleteVertexArrays(1, &VertexArrayID);// Close OpenGL window and terminate GLFWglfwTerminate();return 0;
}

2. shader.cpp

#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <sstream>
using namespace std;#include <stdlib.h>
#include <string.h>#include <GL/glew.h>#include "shader.hpp"GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path){// Create the shadersGLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);// Read the Vertex Shader code from the filestd::string VertexShaderCode;std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);if(VertexShaderStream.is_open()){std::stringstream sstr;sstr << VertexShaderStream.rdbuf();VertexShaderCode = sstr.str();VertexShaderStream.close();}else{printf("Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !n", vertex_file_path);getchar();return 0;}// Read the Fragment Shader code from the filestd::string FragmentShaderCode;std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);if(FragmentShaderStream.is_open()){std::stringstream sstr;sstr << FragmentShaderStream.rdbuf();FragmentShaderCode = sstr.str();FragmentShaderStream.close();}GLint Result = GL_FALSE;int InfoLogLength;// Compile Vertex Shaderprintf("Compiling shader : %sn", vertex_file_path);char const * VertexSourcePointer = VertexShaderCode.c_str();glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);glCompileShader(VertexShaderID);// Check Vertex ShaderglGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);if ( InfoLogLength > 0 ){std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);printf("%sn", &VertexShaderErrorMessage[0]);}// Compile Fragment Shaderprintf("Compiling shader : %sn", fragment_file_path);char const * FragmentSourcePointer = FragmentShaderCode.c_str();glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);glCompileShader(FragmentShaderID);// Check Fragment ShaderglGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);if ( InfoLogLength > 0 ){std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1);glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);printf("%sn", &FragmentShaderErrorMessage[0]);}// Link the programprintf("Linking programn");GLuint ProgramID = glCreateProgram();glAttachShader(ProgramID, VertexShaderID);glAttachShader(ProgramID, FragmentShaderID);glLinkProgram(ProgramID);// Check the programglGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);if ( InfoLogLength > 0 ){std::vector<char> ProgramErrorMessage(InfoLogLength+1);glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);printf("%sn", &ProgramErrorMessage[0]);}glDetachShader(ProgramID, VertexShaderID);glDetachShader(ProgramID, FragmentShaderID);glDeleteShader(VertexShaderID);glDeleteShader(FragmentShaderID);return ProgramID;
}

3. shader.hpp

#ifndef SHADER_HPP
#define SHADER_HPPGLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path);#endif

4. ColorFragmentShader.fragmentshader

#version 330 core// Interpolated values from the vertex shaders
in vec3 fragmentColor;// Ouput data
out vec3 color;void main(){// Output color = color specified in the vertex shader, // interpolated between all 3 surrounding verticescolor = fragmentColor;}

5. TransformVertexShader.vertexshader

#version 330 core// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec3 vertexColor;// Output data ; will be interpolated for each fragment.
out vec3 fragmentColor;
// Values that stay constant for the whole mesh.
uniform mat4 MVP;void main(){	// Output position of the vertex, in clip space : MVP * positiongl_Position =  MVP * vec4(vertexPosition_modelspace,1);// The color of each vertex will be interpolated// to produce the color of each fragmentfragmentColor = vertexColor;
}

 

本文发布于:2024-02-08 20:20:10,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739513368856.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:爱心   OVA   Shader   OBA
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23