计算机图形学课程设计报告书[海军风格场景渲染]

计算机图形学课程设计报告书

一、选题

海军风格场景渲染

二、需求分析

用Visual Studio 2017 + OpenGL + GLSL环境,实现模型导入、光照、阴影、纹理、模型导入,实现泛光或其他特效,实现交互功能。

三、系统设计

1、算法和程序流程:

四、界面设计

    采用图形界面,通过鼠标和按键WASD交互。

五、系统实现

核心代码:

/

// 程序名称:海军风格场景渲染

// 编译环境:VS2017+OpenGL+GLSL

// 作  者:CSDN——哆啦一泓

// 最后修改:2018-11-2

/

int main()

{

    glfwInit();

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);



    Shader shader("6.1.cubemaps.vs", "6.1.cubemaps.fs");

    Shader skyboxShader("6.1.skybox.vs", "6.1.skybox.fs");

        Shader ourShader("1.model_loading.vs", "1.model_loading.fs");

        Shader ourShader0("model.vs", "model.fs");



        Model ourModel(FileSystem::getPath("resources/objects/Cruisership 2012/Cruiser 2012.obj"));



    unsigned int skyboxVAO, skyboxVBO;

    glGenVertexArrays(1, &skyboxVAO);

    glGenBuffers(1, &skyboxVBO);

    glBindVertexArray(skyboxVAO);

    glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO);

    glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

    unsigned int cubemapTexture = loadCubemap(faces);

    shader.use();

    shader.setInt("texture1", 0);

    skyboxShader.use();

    skyboxShader.setInt("skybox", 0);



    while (!glfwWindowShouldClose(window))

    {

                 ourShader.use();

        shader.use();

               model = glm::scale(model, glm::vec3(0.1f));

                 model = glm::translate(model, glm::vec3(0.0f, -600.0f, -500.0f));

                 shader.setMat4("model", model);

        shader.setMat4("view", view);

        shader.setMat4("projection", projection);



                 glm::mat4 model0;

                 model0 = glm::translate(model0, glm::vec3(0.0f, -1.75f, -1000.0f)); // translate it down so it's at the center of the scene

                 model0 = glm::scale(model, glm::vec3(0.2f, 0.2f, 0.2f));        // it's a bit too big for our scene, so scale it down

                 ourShader.setMat4("model0", model0);

                 ourModel.Draw(ourShader);

                 ourShader.setMat4("model", model);



        glDepthFunc(GL_LEQUAL);  // change depth function so depth test passes when values are equal to depth buffer's content

        skyboxShader.use();

        view = glm::mat4(glm::mat3(camera.GetViewMatrix())); // remove translation from the view matrix

        skyboxShader.setMat4("view", view);

        skyboxShader.setMat4("projection", projection);

        // skybox cube

        glBindVertexArray(skyboxVAO);

        glActiveTexture(GL_TEXTURE0);

        glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture);

        glDrawArrays(GL_TRIANGLES, 0, 36);

        glBindVertexArray(0);

        glDepthFunc(GL_LESS); // set depth function back to default



                 // we now draw as many light bulbs as we have point lights.

                 glBindVertexArray(lightVAO);

                 for (unsigned int i = 0; i < 4; i++)

                 {

                         model = glm::mat4();

                         model = glm::translate(model, pointLightPositions[i]);

                         model = glm::scale(model, glm::vec3(0.2f)); // Make it a smaller cube

                         glDrawArrays(GL_TRIANGLES, 0, 36);

                 }



        // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)

        // -------------------------------------------------------------------------------

        glfwSwapBuffers(window);

        glfwPollEvents();

    }



    glDeleteVertexArrays(1, &skyboxVAO);

    glDeleteBuffers(1, &skyboxVAO);

    glfwTerminate();

    return 0;

}

六、心得与体会

此次课程设计,我深刻体会到了编程知识积累的重要性。在课设中我遇到了不少难题,但是经过仔细研究,得到解决。2周的课设结束了,我的收获颇丰,同时也更深刻地认识到要做一个合格的程序员最重要的是严谨。计算机图形学的课程设计使我学到了很多东西,为我以后的学习做了引导,点明了方向。

这次课设,我更多学到的是不懂就要问和尽全力尝试,哪怕失败,也要竭尽全力,最后在自己的努力下,取得成功,这种感觉美不可言,成就感十足。相信在不久的将来,我会开创自己的一片天空。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1. 通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及bresenham算法的基本原理; 2. 掌握以上算法生成直线段的基本过程; 3. 通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、 复习有关算法的基本原理,明确实验目的和要求; 2、 依据算法思想,绘制程序流程图; 3、 设计程序界面,要求操作方便; 4、 用C/C++语言编写源程序并调试、执行; 5、 分析实验结果 6、 对程序设计过程中出现的问题进行分析与总结; 7、 打印源程序或把源程序以文件的形式提交; 8、 按格式要求完成实验报告。 实验报告要求: 1、 各种算法的基本原理; 2、 各算法的流程图 3、 实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、 实验总结(含问题分析及解决方法) 实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、 通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、 掌握以上算法生成圆和圆弧的基本过程; 3、 掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1. 复习有关圆的生成算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3. 设计程序界面,要求操作方便; 4. 用C/C++语言编写源程序并调试、执行; 5. 分析实验结果 6. 对程序设计过程中出现的问题进行分析与总结; 7. 打印源程序或把源程序以文件的形式提交; 8. 按格式要求完成实验报告。 实验报告要求: 1. 分析算法的工作原理; 2. 画出算法的流程图 3. 实验结果及分析(比较圆与圆弧生成算法的不同) 4. 实验总结(含问题分析及解决方法) 实验3 多边形的区域填充 学时:2 实验类型:设计性 实验类别:专业实验 实验目的 1. 通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理 2. 掌握多边形区域填充算法的基本过程 3. 掌握在C/C++环境下用多边形填充算法编程实现指定多边形的填充。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用种子填充算法和扫描线填充算法等任意两种算法实现指定多边形的区域填充。 实验步骤 1. 复习有关算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(指定填充多边形); 3. 设计程序界面,要求操作方便; 4. 用C/C++语言编写源程序并调试、执行(最好能用动画显示填充过程); 5. 分析实验结果 6. 对程序设计过程中出现的问题进行分析与总结; 7. 打印源程序或把源程序以文件的形式提交; 8. 按格式要求完成实验报告。 实验报告要求: 1. 分析算法的工作原理; 2. 画出算法的流程图 3. 实验结果及分析(比较两种算法的不同) 4. 实验总结(含问题分析及解决方法)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值