linux - EGL 和 OpenGL 只产生黑屏
问题描述
我已经编写了附加的示例程序,该示例程序将 GTK2 与 EGL 和 OpenGL 结合使用。在我的系统上,这工作正常。在朋友的 PC 上,它只会产生一个黑色窗口,我无法解释为什么会发生这种情况。我们事件跟踪哪些库被加载(哪些是相同的)。我的电脑有一个 NVIDIA MX150,他有一个 GTX 1030,他使用 Debian Strech,我使用 Debian buster。
我无法解决这个问题。无论如何,这是代码:
#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <EGL/egl.h>
#include <GL/gl.h>
static EGLDisplay egl_display;
static EGLSurface egl_surface;
static EGLContext egl_context;
static void realize_cb (GtkWidget *widget)
{
printf("REALIZE\n");
EGLConfig egl_config;
EGLint n_config;
EGLint attributes[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE };
EGLint surf_attrs[] = {
EGL_RENDER_BUFFER, EGL_BACK_BUFFER,
EGL_NONE
};
egl_display = eglGetDisplay ((EGLNativeDisplayType) gdk_x11_display_get_xdisplay (gtk_widget_get_display (widget)));
eglInitialize (egl_display, NULL, NULL);
eglChooseConfig (egl_display, attributes, &egl_config, 1, &n_config);
eglBindAPI (EGL_OPENGL_API);
egl_surface = eglCreateWindowSurface (egl_display, egl_config, GDK_WINDOW_XID (gtk_widget_get_window (widget)), surf_attrs);
egl_context = eglCreateContext (egl_display, egl_config, EGL_NO_CONTEXT, NULL);
}
static gboolean on_configure (GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
gtk_widget_queue_draw(widget);
return FALSE;
}
static gboolean draw_cb (GtkWidget *widget, GdkEventExpose *expose, gpointer userdata)
{
printf("DRAW\n");
eglMakeCurrent (egl_display, egl_surface, egl_surface, egl_context);
GtkAllocation alloc;
gtk_widget_get_allocation(widget, &alloc);
glViewport (0, 0, alloc.width, alloc.height);
glClearColor (0, 0, 0, 1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho (0, 100, 0, 100, 0, 1);
glBegin (GL_TRIANGLES);
glColor3f (1, 0, 0);
glVertex2f (50, 10);
glColor3f (0, 1, 0);
glVertex2f (90, 90);
glColor3f (0, 0, 1);
glVertex2f (10, 90);
glEnd ();
eglSwapBuffers (egl_display, egl_surface);
return TRUE;
}
int main (int argc, char **argv)
{
GtkWidget *w;
gtk_init (&argc, &argv);
w = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_double_buffered (GTK_WIDGET (w), FALSE);
g_signal_connect (G_OBJECT (w), "realize", G_CALLBACK (realize_cb), NULL);
g_signal_connect (G_OBJECT (w), "expose-event", G_CALLBACK (draw_cb), NULL);
g_signal_connect (G_OBJECT (w), "configure-event", G_CALLBACK (on_configure), NULL);
gtk_widget_show (w);
gtk_main ();
return 0;
}
解决方案
推荐阅读
- php - 链接在 PHP 中无法正常工作或显示
- angularjs - 从 umbraco 中的多值数据类型中检索数据
- azure-devops - 如何要求 64 位代理?
- flutter - iOS 上的向后滑动手势被 WillPopScope 覆盖
- r - ggplot2 stat_compare_means 和 wilcox.test 中的不同 p 值
- javascript - 如何使用 JavaScript 和/或 JQuery 为滑动和淡入淡出的文本设置动画?
- android - 当 viewPager 位于主片段中时,如何从 Main Activity 更改 viewPager 的位置
- html - 将文本向上移动,同时与图片保持在同一行中
- java - src-resolve:无法将名称“tns:callResult”解析为(n)“类型定义”
- reactjs - 使用 react-testing 库提交 Formik 表单