目录
0. heart_data.py
2. shader.cpp
3. shader.hpp
4. ColorFragmentShader.fragmentshader
5. TransformVertexShader.vertexshader
python数据离散化脚本:
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;
}
#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;
}
#ifndef SHADER_HPP
#define SHADER_HPPGLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path);#endif
#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;}
#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小时内删除。
留言与评论(共有 0 条评论) |