// StgSharpGraphics.c : 定义 DLL 的导出函数。 // #include "StgSharpGraphics.h" #include "glad/glad.h" #include "GLFW/glfw3.h" #include "framework.h" #include "stdio.h" #include "internal.h" extern float* triangleVertexes; double previousTime = 0; double targetFPS = 60.0; const char* vertexShaderSource = "#version 460 core\n" "layout (location = 0) in vec3 aPos;\n" "void main()\n" "{\n" "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\n\0"; const char* fragmentShaderSource = "#version 460 core\n" "out vec4 FragColor;\n" "void main()\n" "{\n" "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0" ; float triangle[] = { 0,0.5f,0, -0.5f,-0.5f,0, 0.5f,-0.5f,0, }; int version[4] = { 0,0,0,0 }; STGSHARPGRAPHICS_API int* versionInfo = &version; // 这是导出函数的一个示例。 STGSHARPGRAPHICS_API IOpackage initPackage(void) { IOpackage pack; pack.InitWindow = InitWindow; return pack; } STGSHARPGRAPHICS_API basicWindowInfo* InitWindow(basicWindowInfo info) { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif // __APPLE__ GLFWwindow* window = glfwCreateWindow(info.width, info.height, info.name, NULL, NULL); if (window == NULL) { printf("Failed to create GLFW window"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { printf("Failed to initialize GLAD"); return -1; } glfwSwapInterval(0); return window; } STGSHARPGRAPHICS_API void ComppileShader(void) { //编译顶点着色器 unsigned int vertexShader; vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); //编译片段着色器 unsigned int fragmentShader; fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); //创建着色器程序 unsigned int shaderProgram; shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glUseProgram(shaderProgram); glDeleteShader(vertexShader); glDeleteShader(fragmentShader); // 链接顶点属性 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); //创建顶点缓存实例 unsigned int VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * 3, triangle, GL_STATIC_DRAW); //创建顶点数组实例 unsigned int VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); // 2. 把顶点数组复制到缓冲中供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * 3, triangle, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); /**/ } STGSHARPGRAPHICS_API void RenderWindow(GLFWwindow* window, basicWindowInfo info) { while (!glfwWindowShouldClose(window)) { if (1) { } // input // ----- // render // ------ /**/ glClearColor( info.backgroundColor.x, info.backgroundColor.y, info.backgroundColor.Z, info.backgroundColor.w ); /**/ //glClearColor(0.1f,0.3f,0.5f,1.0f); glClear(GL_COLOR_BUFFER_BIT); // draw our first triangle /* glUseProgram(shaderProgram); glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to bind it every time, // but we'll do so to keep things a bit more organized glDrawArrays(GL_TRIANGLES, 0, 3); //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); // glBindVertexArray(0); // no need to unbind it every time /**/ // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) // ------------------------------------------------------------------------------- glfwSwapBuffers(window); glfwPollEvents(); } } STGSHARPGRAPHICS_API void TerminateWindow(void) { // glfw: terminate, clearing all previously allocated GLFW resources. // ------------------------------------------------------------------ glfwTerminate(); /* //glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); //glDeleteBuffers(1, &EBO); glDeleteProgram(shaderProgram); /**/ }