SDL2 dengan OpenGL - hasil yang aneh, ada apa?

8

Saya porting aplikasi ke iOS, dan karena itu perlu memutakhirkannya ke SDL2 dari SDL1.2 (sejauh ini saya mengujinya sebagai aplikasi desktop hanya pada OS X). Namun, ketika menjalankan kode dengan SDL2, saya mendapatkan hasil yang aneh seperti yang ditunjukkan pada gambar kedua di bawah ini (gambar pertama adalah tampilannya dengan SDL, dengan benar). Changeet tunggal yang menyebabkan ini adalah ini , apakah Anda melihat sesuatu yang jelas salah di sana, atau apakah SDL2 memiliki beberapa nuansa OpenGL yang saya tidak sadari? SDL saya didasarkan pada yang terbaru dari HG .

Pembaruan: pertanyaan lain tentang port iOS dari proyek yang sama ada di sini .

Pembaruan 2: ini sekarang juga di newsgroup SDL: http://thread.gmane.org/gmane.comp.lib.sdl/58026

Pembaruan 3: Saya mencoba menggunakan Regal untuk OpenGL portabel, hasil yang tidak begitu baik ada pada tangkapan layar ketiga, diproduksi hanya dengan mengganti

#include <OpenGL/gl.h>
#include <OpenGL/glu.h>

dengan

#include "GL/Regal.h"
#include "GL/RegalGLU.h"

menggunakan SDL 1.2 menggunakan SDL 2 menggunakan Regal dengan SDL 2

Gabor
sumber
1
Mungkinkah (untuk alasan apa pun) sprite / partikel hanya diputar ~ 90 °, atau direntangkan menjadi empat persegi panjang yang sangat tipis? Tampilan kerangka gambar harus memungkinkan Anda memeriksanya dengan cepat.
2
Menurut perubahan yang Anda tautkan, Anda merender menggunakan glCallLists (), yang tidak didukung di bawah OpenGL ES (yang akan Anda gunakan di iOS). (Saya agak terkejut bahwa itu tidak memberi Anda kompilasi kesalahan pada iOS, jujur ​​saja.)
Trevor Powell
tangkapan layar datang dari OS X, porting iOS datang setelah itu (glCallLists hanya digunakan untuk rendering teks yang spesifik linux jadi saya tidak menggunakannya bahkan pada OS X)
Gabor

Jawaban:

7

Inilah pemberitahuan masalah Anda, saya mengomentari permukaan = SDL_Get ... itu memberikan beberapa hasil aneh. Anda juga lupa membuat konteks OpenGL. Beri tahu saya jika Anda memiliki masalah lain.

SDLWindow::SDLWindow(int width, int height, double axisLen, const std::string &caption)
:m_fov(axisLen)
,m_width(0)
,m_height(0)
,m_fps(0)
,m_idxSnapshot(0)
,m_camPos(0, 0, 2)
,m_camLookAt(0, 0, 0)
,m_camOrient(0, 1, 0)
,surface(NULL)
,m_texStar(0)
,m_bRunning(true)
{
SDL_GLContext ctx;

if (SDL_Init(SDL_INIT_VIDEO) < 0)
    throw std::runtime_error(SDL_GetError());
atexit(SDL_Quit);

SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 0 );
SDL_GL_SetAttribute( SDL_GL_RETAINED_BACKING, 1 ); 

 if ((window = SDL_CreateWindow(caption.c_str(), SDL_WINDOWPOS_CENTERED,
 SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | 
 SDL_WINDOW_BORDERLESS)) == NULL)
    throw std::runtime_error(SDL_GetError());     

/*if ((surface = SDL_GetWindowSurface(window)) == NULL)
    throw std::runtime_error(SDL_GetError());*/

m_width = width;
m_height = height;

ctx = SDL_GL_CreateContext(window);

InitGL();
}
Steven
sumber