模板测试练习 选中效果

完整程序

https://github.com/WaldenPonder/opengl-test/tree/master/t004

#include "stdafx.h"
#include "../common/common.out.h"

int _tmain(int argc, _TCHAR* argv[])
{
    GLfloat cubePts[180];
    tools::GetCubePts_withTexture(cubePts);

    GLFWwindow* window; 
    PREPARE_GLFW_WINDOW(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_NAME, tools::default_key_callback);
    g_Mat4 = glm::mat4(1.0);

    GLuint VAO, VBO;
    {
        glGenVertexArrays(1, &VAO);
        glGenBuffers(1, &VBO);

        glBindVertexArray(VAO);
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(cubePts), cubePts, GL_STATIC_DRAW);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * FLOAT_SIZE, (void*)0);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * FLOAT_SIZE, (void*)(3 * FLOAT_SIZE));
        glEnableVertexAttribArray(1);

        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }

    GLuint texture = tools::CreateTexture("../common/src/container.jpg");
    Shader shader("vert004.v", "frag004.f");
    Shader shader2("vert004_2.v", "frag004_2.f");

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_STENCIL_TEST);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

    while (!glfwWindowShouldClose(window))
    {
        glfwPollEvents();

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
        glClearColor(.2, .3, .6, 1);
        glClearStencil(123);

        //不调用结果奇怪
        glEnable(GL_CULL_FACE);

        //1
        glm::mat4 Mat1 = g_Mat4;
        glEnable(GL_DEPTH_TEST);
        glStencilFunc(GL_ALWAYS, 1, 0xFF);
        glStencilMask(0xFF);
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        shader.Use();
        shader.setUniformMat4f("vert_mat", Mat1);
        shader.setUniformTexture2D("SAMP", texture, 0);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 36);
        glBindVertexArray(0);

        //2
        float s = 1.02f;
        glm::mat4 Mat2 = glm::scale(g_Mat4, glm::vec3(s, s, s));        
        glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
        glStencilMask(0x00);
        glDisable(GL_DEPTH_TEST);
        //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        //glLineWidth(3);
        shader2.Use();
        shader2.setUniformMat4f("vert_mat", Mat2);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 36);

        glBindVertexArray(0);
        glStencilMask(0xFF);
        glEnable(GL_DEPTH_TEST);

        glfwSwapBuffers(window);
    }

    glfwSwapBuffers(window);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值