【问题标题】:Tetrahedron side not appearing, not winding order issue四面体面不出现,不是缠绕顺序问题
【发布时间】:2021-05-29 17:17:11
【问题描述】:

在让绿色面出现时遇到问题,最初认为这是一个剔除或缠绕顺序问题,但可以使用新的视角来了解我做错了什么。

目前的问题是绿边,但始终是首先绘制的三角形。

使用的库: Glew & Glfw3

#include <iostream>

#define GLEW_STATIC
#include "GL/glew.h"
#include "GLFW/glfw3.h"

const char* WINDOW_TITLE = "Practice";
const GLint WINDOW_WIDTH = 600;
const GLint WINDOW_HEIGHT = 600;

static void error_callback(int error, const char* description)
{
    fprintf(stderr, "Error: %s\n", description);
}

int main()
{
    GLFWwindow* window;

    if (!glfwInit()) {
        std::cout << "GLFW initialisation failed." << std::endl;
        return -1;
    }

    glfwSetErrorCallback(error_callback);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

    window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE, NULL, NULL);

    if (!window)
    {
        std::cout << "GLFW failed to create window." << std::endl;
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
    if (err != GLEW_OK)
    {
        /* Problem: glewInit failed, something is seriously wrong */
        std::cout << "GLEW initialisation failed: " << glewGetErrorString(err) << std::endl;
        return -1;
    }
    std::cout << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << std::endl;

    /* Choose a colour to clear the screen (RGBA range 0-1) */
    glClearColor(0.4f, 0.5f, 0.6f, 1.0f);

    glEnable(GL_CULL_FACE | GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glCullFace(GL_BACK);

    /* Loop until the user closes the window */

    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);

        glRotatef(.5f, 1.f, 1.f, 1.f);

        float r = 0.5f; 
        glBegin(GL_TRIANGLES);

1,0,0 正面(绿色)- 脸不出现

        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(r, r, -r);
        glVertex3f(r, -r, r);
        glVertex3f(-r, -r, -r);

0,1,0 朝向(红色)

        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(r, r, -r);
        glVertex3f(-r, -r, -r);
        glVertex3f(-r, r, r);

0,0,1 朝向(蓝色)

        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-r, r, r);
        glVertex3f(-r, -r, -r);
        glVertex3f(r, -r, r);

1,1,1 朝向(白色)

        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex3f(r, r, -r);
        glVertex3f(-r, r, r);
        glVertex3f(r, -r, r);

        glEnd();

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

【问题讨论】:

    标签: c++ opengl opengl-compat


    【解决方案1】:

    GL_CULL_FACEGL_DEPTH_TEST 是枚举常量,不要指定位集的位。 GL_CULL_FACE 的值为 0x0B44,GL_DEPTH_TEST 的值为 0x0B71。因此,glEnable(GL_CULL_FACE | GL_DEPTH_TEST 没有任何意义,会导致 GL_INVALID_ENUM 错误。 glEnable 的参数必须是单个枚举常量。您必须分别启用每个功能:

    glEnable(GL_CULL_FACE | GL_DEPTH_TEST);

    glEnable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    

    您的正面具有顺时针缠绕顺序。默认缠绕顺序是逆时针。因此,您需要使用glFrontFace 更改正面多边形的方向规范:

    glFrontFace(GL_CW);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多