Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.08.2013, 19:07

Grafik wird nicht ausgegeben || Buch: 3D Grafik mit OpenGL von Marius Apetri

Hallo Leute, ich brauche eure Hilfe bei diesem Problem:

Der Sinn und Zweck dieser Aufgabe ist es eine kleine Grafik auszugeben was bei mir nicht der Fall ist.
Das Fenster wird erstellt ABER es ist schwarz --> Man sieht die Grafik nicht.
Wo liegt das Problem???

IDE: Microsoft Visual C++ 2010 Express


Quellcode

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
#include <Windows.h>
#include <GL/glut.h>


#include "screen_interface.h"

struct vertex
{
  GLint wx, wy;

  vertex( void ) : wx( 0 ), wy( 0 ) { }
  vertex( GLint x, GLint y ) : wx( x ), wy( y ) { }
};

MSG msg;
unsigned char key_pressed( void );

int WINAPI WinMain( HINSTANCE hinst, HINSTANCE pinst, LPSTR cmdl, int cmds )
{
  screen_interface.open_window( hinst, 640, 480 );

  vertex a( 80, 80 );
  vertex b( 560, 400 );
  vertex c( 160, 150 );
  vertex d( 480, 330 );

  glClearColor( 0.25f, 0.2f, 1, 0 );
  glClear( GL_COLOR_BUFFER_BIT );

  while( 1 )
  {
    if( key_pressed() ) break;  

    vertex pos;
    pos.wx = a.wx + (rand() % (b.wx - a.wx + 1));
    pos.wy = a.wy + (rand() % (b.wy - a.wy + 1));

    if( pos.wx >= c.wx && pos.wx <= d.wx && pos.wy >= c.wy && pos.wy <= d.wy )
    continue;

    glBegin( GL_POINTS );

    GLubyte c = rand() % 256;

    glColor3ub( c, c, c );
    glVertex2i( pos.wx, pos.wy );

    glEnd();
  }

  return msg.wParam;
}

unsigned char key_pressed( void )
{
  if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
  {
    if( msg.message == WM_QUIT || msg.message == WM_KEYDOWN ) return 1;

    TranslateMessage( &msg );
    DispatchMessage( &msg );
  }

  return 0;
}

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

2

17.08.2013, 20:17

Ist es denn ein richtiges schwarz oder deine angegebene "ClearColor"?
Wenn es ein richtiges schwarz ist, dann gab es wahrscheinlich einen Fehler in der OpenGL-Kontext-Erstellung, ansonsten,
hast du die Projektionsmatrix gesetzt?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

17.08.2013, 21:07

Wie genau erzeugst du dein OpenGL Fenster und wo genau rufst du SwapBuffers() auf?

4

21.08.2013, 21:57

Ich glaube das hier der Kontext für OpenGL noch gar nicht erzeugt wurde, das Window evtl. auch keinen eigenen DeviceContext besitzt, udn der Aufruf an SwapBuffers() auch gänzlich fehlt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));

    int iFormat;

    m_hDC = GetDC(m_hWnd);

    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW |
                PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;

    iFormat = ChoosePixelFormat(m_hDC, &pfd);

    SetPixelFormat(m_hDC, iFormat, &pfd);

    m_hRC = wglCreateContext(m_hDC);

    wglMakeCurrent(m_hDC, m_hRC);


Das sollte deinen Kontext für das Fenster hWnd mit der HINSTANCE hInstance einrichten. Außerdem sieht es so aus als hätte dot schon einen weiteren Punkt angesprochen: du musst SwapBuffers() aufrufen, sonst zeichnest du die ganze Zeit in den Backbuffer, den du allerdings nie auf den Blidschirm bringst.

Hoffentlich hilft dir das,
Liebe Grüße,
~ EuadeLuxe ~

Werbeanzeige