首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用raylib呈现nuklear失败

使用raylib呈现nuklear失败
EN

Stack Overflow用户
提问于 2021-02-14 12:41:30
回答 2查看 216关注 0票数 1

我尝试在Raylib 3.5中使用Nuklear3.5,但是渲染失败了,没有任何错误消息,只有一个白色窗口。

由于Nuklear可以与前端的任何渲染器一起使用,所以我尝试将Raylib与Nuklear结合起来。据我所见,Raylib使用OpenGL 3.4作为它的渲染器。

我的想法很简单:

  1. 使用Raylib中的"GetWindowHandle()“获取由"InitWindow()”函数创建的GLFWwindow实例。
  2. 然后,使用"nk_glfw3_init()“函数来获取它。

然而,这个想法失败了。我得到的只是一个空的空白窗口,没有渲染结果。

我对OpenGL和核很陌生。有人能给我看看光吗?

下面是这个天真实验的简单C代码。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <limits.h>
#include <time.h>

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
#define NK_INCLUDE_FONT_BAKING
#define NK_INCLUDE_DEFAULT_FONT
#define NK_IMPLEMENTATION
#define NK_GLFW_GL3_IMPLEMENTATION
#define NK_KEYSTATE_BASED_INPUT
#include "nuklear.h"
#include "nuklear_glfw_gl3.h"

#include "raylib.h"

#define MAX_VERTEX_BUFFER 512 * 1024
#define MAX_ELEMENT_BUFFER 128 * 1024

int main(void)
{

    int screenWidth = 800;
    int screenHeight = 600;

    struct nk_glfw glfw = {0};
    struct nk_context *ctx;

    struct nk_font_atlas *atlas;
    

    InitWindow(screenWidth, screenHeight, "raylib combining with Nuklear");
    SetTargetFPS(60);               

    if (glewInit() != GLEW_OK) {
        fprintf(stderr, "Failed to setup GLEW\n");
        exit(1);
    }

    static GLFWwindow *win; 
    win = GetWindowHandle();

    ctx = nk_glfw3_init( &glfw, win , NK_GLFW3_INSTALL_CALLBACKS);
    nk_glfw3_font_stash_begin(&glfw, &atlas);
    nk_glfw3_font_stash_end(&glfw);
    
    while (!WindowShouldClose())    
    {

        nk_glfw3_new_frame(&glfw);

        if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),
            NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
            NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
        {
            enum {EASY, HARD};
            static int op = EASY;
            static int property = 20;
            nk_layout_row_static(ctx, 30, 80, 1);
            if (nk_button_label(ctx, "button"))
                TraceLog(LOG_INFO, "DISPLAY: Nuklear button clicked!");

            nk_layout_row_dynamic(ctx, 30, 2);
            if (nk_option_label(ctx, "easy", op == EASY)) op = EASY;
            if (nk_option_label(ctx, "hard", op == HARD)) op = HARD;

            nk_layout_row_dynamic(ctx, 25, 1);
            nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1);

        }
        nk_end(ctx);

        BeginDrawing();
        nk_glfw3_new_frame(&glfw);
        DrawFPS(10,10);
        ClearBackground(RAYWHITE);
        DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY);

        //glViewport(0, 0, screenWidth, screenHeight);
        nk_glfw3_render(&glfw, NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
        //glfwSwapBuffers(win);
        EndDrawing();
    
    }

    CloseWindow();       
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-09 20:26:54

射线库-核上制作了一些射线库和核集成库。它不是使用nuklear呈现,而是直接使用raylib的绘图方法。

票数 0
EN

Stack Overflow用户

发布于 2021-03-10 14:44:06

这个问题我不太清楚,但您可以选择使用不同版本的OpenGL来呈现,也可以选择使用旧版本的OpenGL。

当然,再检查一遍,这样所有的东西都会正确地连接起来。

希望你能解决这个问题!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66195515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档