Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод OpenGL через GTK+2 на Ruby, Как правильно выводить OpenGLную графику 
:(
    Опции темы
Camel
  Дата 10.1.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.4.2006

Репутация: нет
Всего: 2



Пытаюсь освоится с Ruby, GTK+2 и OpenGL. Легче всего с Ruby, с GTK+2 тоже всё не сложно, благодаря ruby-gnome2, а вот с OpenGL проблема. Пытаюсь написать первый пример из учебника по OpenGL известного как Red Book. DrawingArea чёрным заполняется, но вот белый квадрат не рисуется. Подскажите как правильно. Может у кого-нибудь есть работающая программа выводящая OpenGL'ную графику в GTK'шном окне? 
Выделить всёРазвернуть кодкод Perl
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
#!/usr/bin/env ruby
# main.rb
$KCODE='U'
require 'glconfig'
require 'gtkglext'
include Gl,Glu,Glut
class GLDrawingArea < Gtk::DrawingArea
  def initialize(glconfig)
    super()
    set_gl_capability(glconfig)
  end
end
window = Gtk::Window.new("OpenGL Drawing Area")
# Add VBox for placing drawing area and Quit button. 
vbox = Gtk::VBox.new(false, 0)
window.add(vbox)
# Set GL configuration.
glconfig = create_glconfig
examine_gl_config_attrib(glconfig# Puts OpenGL configuration on the screen.
# Add drawing area. 
area = GLDrawingArea.new(glconfig)
area.set_size_request(400,400)
area.signal_connect("expose_event"do 
# GL code. 
  area.gl_drawable.gl_begin(area.gl_contextdo
# Clearing the screen.
    glClearColor(0.00.00.00.0)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0.01.00.01.0, -1.01.0)
    glClear(GL_COLOR_BUFFER_BIT)
# Setting drawing color to white. 
    glColor(1.01.01.0)
    glBegin(GL_POLYGON)
# Setting 4 vertices of a square. 
      glVertex3f(0.250.250.0)
      glVertex3f(0.750.250.0)
      glVertex3f(0.750.750.0)
      glVertex3f(0.250.750.0)
    glEnd()
# Showing on the screen. 
    area.gl_drawable.swap_buffers
  end
end
vbox.pack_start(area, true, true, 0)
# Add Quit button. 
button = Gtk::Button.new("Quit")
button.signal_connect("clicked") { Gtk.main_quit }
vbox.pack_start(button, false, false, 0)
# Show window on the screen. 
window.show_all
Gtk.main

Функции скопировал из этого примера. Да и вообще много чего там подсмотрел, но заставить отрисоваться белый квадрат не получается. 
Выделить всёРазвернуть кодкод Perl
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
# glconfig.b
$KCODE='U'
require 'gtkglext'
  def create_glconfig
    # Try double-buffered visual
    glconfig = Gdk::GLConfig.new(Gdk::GLConfig::MODE_RGB|
                                 Gdk::GLConfig::MODE_DEPTH|
                                 Gdk::GLConfig::MODE_DOUBLE)
    
    unless glconfig
      puts "*** Cannot find the double-buffered visual."
      puts "*** Trying single-buffered visual."
      
      # Try single-buffered visual
      glconfig = Gdk::GLConfig.new(Gdk::GL::MODE_RGB|
                                   Gdk::GL::MODE_DEPTH)
      raise  "No appropriate OpenGL-capable visual found." unless 
glconfig
    end
    glconfig
  end

Вот что имею
user posted image
PM MAIL   Вверх
kemiisto
  Дата 17.1.2009, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



Camel, вот возьмите рабочий шаблон:
Выделить всёРазвернуть кодБез подсветки
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
#!/usr/bin/env ruby
require 'gtkglext'
## -----------------------------------------------------------------------------
## A generic class for OpenGL application functions.
## -----------------------------------------------------------------------------
class GLRender
  attr_reader :fov
  def initialize(fov = 90.0)
    @fov = fov
  end
  ## Initialise OpenGL state for 3D rendering.
  def init()
    GL.ShadeModel(GL::SMOOTH)
    GL.Enable(GL::DEPTH_TEST)
    GL.DepthFunc(GL::LEQUAL)
    GL.ClearColor(0.0, 0.0, 0.0, 0.0)
    GL.Hint(GL::PERSPECTIVE_CORRECTION_HINT, GL::NICEST)
    true
  end
  ## Resize OpenGL viewport.
  def resize(width, height)
    GL.Viewport(0, 0, width, height)
    GL.MatrixMode(GL::PROJECTION)
    GL.LoadIdentity()
    GLU.Perspective(@fov, width.to_f() / height.to_f(), 0.1, 1024.0)
    
    GL.MatrixMode(GL::MODELVIEW)
    GL.LoadIdentity()
  end
  ## Render OpenGL scene.
  def draw()
    GL.Clear(GL::COLOR_BUFFER_BIT | GL::DEPTH_BUFFER_BIT)
    GL.LoadIdentity()
    ## Scene view translation. ---------------------------------------------->>>
    GL.Translate(0.0, 0.0, -1.0)
    GL.Rotate(0.0, 0.0, 0.0, 0.0)
    ## -------------------------------------------------------------------------
    ## Scene Rendering Code ------------------------------------------------->>>
    GL.Begin(GL::POLYGON)
      GL.Vertex3f(0.25, 0.25, 0.0)
      GL.Vertex3f(0.75, 0.25, 0.0)
      GL.Vertex3f(0.75, 0.75, 0.0)
      GL.Vertex3f(0.25, 0.75, 0.0)
    GL.End()
    ## -------------------------------------------------------------------------
    GL.Flush()
  end
end
## -----------------------------------------------------------------------------
## A GtkDrawingArea widget with OpenGL rendering capabilities.
## -----------------------------------------------------------------------------
class GLDrawingArea < Gtk::DrawingArea
  def initialize(width, height, fov, gl_config)
    super()
    set_size_request(width, height)
    set_gl_capability(gl_config)
    ## Create an OpenGL renderer instance.
    @render = GLRender.new(fov)
    ## Signal handler for drawing area initialisation.
    signal_connect_after("realize") do
      gl_begin() { @render.init() }
    end
    ## Signal handler for drawing area reshapes.
    signal_connect_after("configure_event") do
      gl_begin() { @render.resize(allocation.width, allocation.height) }
    end
    ## Signal handler for drawing area expose events.
    signal_connect_after("expose_event") do
      gl_begin() do
        @render.draw()
      end
      gl_drawable.swap_buffers() if gl_drawable.double_buffered?
    end
    ## Add mouse button press/release signal event handlers
    add_events(Gdk::Event::BUTTON_PRESS_MASK |
               Gdk::Event::BUTTON_RELEASE_MASK)
    signal_connect_after("button_press_event") { button_press_event() }
    signal_connect_after("button_release_event") { button_release_event() }
  end
  def gl_begin()
    gl_drawable.gl_begin(gl_context) { yield }
  end
  def button_press_event()
    puts "button_press_event"
    true
  end
  def button_release_event()
    puts "button_release_event"
    true
  end
end
## -----------------------------------------------------------------------------
## Application GUI Main Window Class
## -----------------------------------------------------------------------------
class AppWindow < Gtk::Window
  attr_reader :gl_area
  def initialize(title, width, height, fov, gl_config)
    super(title)
    ## Connect signals to handle keyboard user input.
    signal_connect_after("key_press_event") { key_press_event() }
    signal_connect_after("key_release_event") { key_release_event() }
    ## Create our GL drawing area widget.
    @gl_area = GLDrawingArea.new(width, height, fov, gl_config)
    add(@gl_area)
    show_all()
  end
  def key_press_event()
    puts "key_press_event"
    true
  end
  def key_release_event()
    puts "key_release_event"
    true
  end
end
## -----------------------------------------------------------------------------
## Application Class
## -----------------------------------------------------------------------------
class GtkGLApp
  attr_reader :window
  def initialize(title, width, height, bpp)
    ## Initialise Gtk[GLExt] library.
    Gtk.init()
    Gtk::GL.init()
    ## Obtain a valid OpenGL context configuration.
    gl_config = Gdk::GLConfig.new(Gdk::GLConfig::MODE_DEPTH |
                                  Gdk::GLConfig::MODE_DOUBLE |
                                  Gdk::GLConfig::MODE_RGBA)
    ## Create application main interface window.
    @window = AppWindow.new(title, width, height, 90.0, gl_config)
    @window.signal_connect_after("delete_event") do
      puts "Closing application."
      @window.destroy()
      Gtk.main_quit()
    end
  end
  def main()
    Gtk.main()  ## Enter into Gtk's main event processing loop.
    true
  end
end
## -----------------------------------------------------------------------------
## Application Entry Point
## -----------------------------------------------------------------------------
if $0 == __FILE__
  ## Create new application context.
  context = GtkGLApp.new("Gtk GL Application", 256, 256, 16)
  context.main()  ## Enter into the main execution loop.
end


Собственно сцена отрисовывается вот тут:
Выделить всёБез подсветки
1:
2:
3:
4:
5:
6:
7:
8:
    ## Scene Rendering Code ------------------------------------------------->>>
    GL.Begin(GL::POLYGON)
      GL.Vertex3f(0.25, 0.25, 0.0)
      GL.Vertex3f(0.75, 0.25, 0.0)
      GL.Vertex3f(0.75, 0.75, 0.0)
      GL.Vertex3f(0.25, 0.75, 0.0)
    GL.End()
    ## -------------------------------------------------------------------------



--------------------
PM MAIL WWW GTalk Jabber   Вверх
Camel
  Дата 17.1.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.4.2006

Репутация: нет
Всего: 2



Я, кстати, ещё нашёл рабочий код в проекте Rubymars. Но пока не причесал его, не выкинул лишнее, поэтому вместо большого белого квадрата посередине рисуется маленький в уголке. Наверное это можно исправить удалив "ненужные" (непонятные мне пока) функции (ну, то есть методы, конечно, но эти методы нужны только для вызова OpenGL'ных функций). 

За шаблон вам, kemiisto, глубокое мерси. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: GUI | Следующая тема »


 




[ Время генерации скрипта: 0.1439 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.