Farbigen Körper mit schatten darstellen mit Opengl

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
wasser
Beiträge: 125
Registriert: 27.11.2006 21:16

Farbigen Körper mit schatten darstellen mit Opengl

Beitrag von wasser »

Hallo, ich bekomme es nicht hin, den Körper einzufärben wenn ich die LIGHT MEMORY nehme. Ohne LIGHT MEMORY kann ich ihn einfärben, hat dann aber keinen Schatten und man erkennt die einzelnen Seiten nicht.
In der "Repeat" habe ich den Körper diese Farbe gegeben :
glColor3f_(0.0,1.0,0.0), er erscheint aber nicht grün, sondern dunkelgrau.

wenn ich der "LighDif" eine Farbe zuweise, erscheint der Körper in dieser Farbe und mit Schatten. Dieses ist aber die Lichtfarbe , die auf den Körper strahlt und nicht meine Farbe die ich eingestellt habe. Die Schatten auf den Körper haben dann ein dunkelgrau.

Ich verzweifle schon fast.

Wer kann mir helfen, das der Körper die Farbe von der "Repeat" bekommt mit einen Schatten beim Drehen?

Code: Alles auswählen

IncludeFile "opengl.pb"

Dim zahl.f(800,2)
Global i.w,i1.w,z1.w,ii.w 
Global text.s  

;-LIGHT MEMORY
Global *LightAmb = AllocateMemory(4*4)
Global *LightDif = AllocateMemory(4*4)
Global *LightPos = AllocateMemory(4*4)

PokeF(*LightAmb,0.0):PokeF(*LightAmb+4,0.0):PokeF(*LightAmb+8,0.0):PokeF(*LightAmb+12,1.0)
PokeF(*LightDif,0.0):PokeF(*LightDif+4,0.0):PokeF(*LightDif+8,0.0):PokeF(*LightDif+12,1.0)
PokeF(*LightPos,0.5):PokeF(*LightPos+4,0.5):PokeF(*LightPos+8,0.5):PokeF(*LightPos+12,1.0)

Structure GLscreen
  container.l
  hWnd.l
  hDC.l
EndStructure

Procedure InitGL()
	glShadeModel_(#GL_SMOOTH)
	glClearStencil_(0)
	glEnable_(#GL_DEPTH_TEST)
	glDepthFunc_(#GL_LEQUAL)
	glHint_(#GL_PERSPECTIVE_CORRECTION_HINT, #GL_NICEST)
	glEnable_(#GL_TEXTURE_2D)

	glLightfv_(#GL_LIGHT0, #GL_AMBIENT, *LightAmb)
	glLightfv_(#GL_LIGHT0, #GL_DIFFUSE, *LightDif)
	glLightfv_(#GL_LIGHT0, #GL_POSITION, *LightPos)

	glEnable_(#GL_LIGHT0)
	glEnable_(#GL_LIGHTING)
EndProcedure

Procedure OpenGLScreen(*p.GLscreen,x,y,w,h)
  If *p
    container = ContainerGadget(#PB_Any,x,y,w,h)
    If container
      hwnd = GadgetID(container)
      pfd.PIXELFORMATDESCRIPTOR
      hdc = GetDC_(hwnd)
      pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
      pfd\nVersion = 1
      pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
      pfd\iLayerType = #PFD_MAIN_PLANE
      pfd\iPixelType = #PFD_TYPE_RGBA
      pfd\cColorBits = 24
      pfd\cDepthBits = 16
      pixformat = ChoosePixelFormat_(hdc, pfd)
      SetPixelFormat_(hdc, pixformat, pfd)
      hrc = wglCreateContext_(hdc)
      wglMakeCurrent_(hdc, hrc)
      SwapBuffers_(hdc)
      glClearColor_(0.0, 0.0, 0.0, 0.0)
      *p\container = container
      *p\hWnd      = GadgetID(container)
      *p\hDC       = hdc
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

If ReadFile(0, "test1.c")  

  For i = 1 To 3
	  text.s=ReadString(0)
  Next
  For i=1 To 5
    text.s=ReadString(0)
    If Left(text.s, 2)="//" 
  	  text.s=ReadString(0)
  	  Break
    EndIf 
  Next
  
  For i1=0 To 800
    text.s=ReadString(0)
		If Left(text, 2)="};" 
		  z1=i1 
		  Break
		EndIf	
	  zahl(i1,0)=ValF(StringField(text, 1, ",")) 
	  zahl(i1,1)=ValF(StringField(text, 2, ",")) 
	  zahl(i1,2)=ValF(StringField(text, 3, ","))  
  Next
  
EndIf
 
  If OpenWindow(0, 0, 0, 800,600,  "TEST",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateGadgetList(WindowID(0))
  ButtonGadget(0,520,10,80,20, "links")
  ButtonGadget(1,520,40,80,20, "rechts")
  
  If OpenGLScreen(screen.GLscreen,10,10,500,500)
  InitGL()
  
  HideWindow(0,0)

    Repeat
      glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
      
      glLoadIdentity_()
   
      glColor3f_(0.0,1.0,0.0)
      glTranslatef_ (0.0,-0.1,0.0)
      glRotatef_(xrot.f,1.0,1.0,1.0)
      glScalef_(0.03,0.03,0.03)
      
      glBegin_(#GL_POLYGON)
			  For ii=0 To z1-1
		      glVertex3f_ (zahl(ii,0), zahl(ii,1), zahl(ii,2))
	      Next
	   glEnd_()
          
      SwapBuffers_(screen\hdc)
      
      Event = WaitWindowEvent(0)
       
      WindowID = EventWindow() 
  
      GadgetID = EventGadget() 
  
      EventType = EventType() 
      
      If Event = #PB_Event_Gadget
        If GadgetID = 0
        xrot.f=xrot.f+5
        EndIf
        If GadgetID = 1
        xrot.f=xrot.f-5
        EndIf
      EndIf   
     
      xrot.f=xrot.f+0.05
      Until Event = #PB_Event_CloseWindow

      ReleaseDC_(screen\hWnd,screen\hDC)

  EndIf

EndIf
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Ist ja wohl auch klar warum. Wenn du die dynamischen OpenGL Lichter verwendest kannst du nur glMaterial... verwenden und nichtmehr glColor..., denn Lichter beziehen sich auf Material und nicht auf Color. Das sind zweierlei Sachen, die man nicht mischen kann.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
wasser
Beiträge: 125
Registriert: 27.11.2006 21:16

Beitrag von wasser »

Hallo Darkdragon, es geht jetzt. Habe Änderungen in der Initgl vorgenommen und die Daten in PokeF ein bisschen verschoben. Danke für deinen Hinweiss :

Code: Alles auswählen

;-LIGHT MEMORY
Global *LightAmb = AllocateMemory(4*4)
Global *LightDif = AllocateMemory(4*4)
Global *LightPos = AllocateMemory(4*4)

PokeF(*LightAmb,0.1):PokeF(*LightAmb+4,0.1):PokeF(*LightAmb+8,0.1):PokeF(*LightAmb+12,1.0)
PokeF(*LightDif,1.0):PokeF(*LightDif+4,1.0):PokeF(*LightDif+8,1.0):PokeF(*LightDif+12,1.0)
PokeF(*LightPos,0.5):PokeF(*LightPos+4,0.5):PokeF(*LightPos+8,0.5):PokeF(*LightPos+12,1.0)

Structure GLscreen
  container.l
  hWnd.l
  hDC.l
EndStructure

Procedure InitGL()
  ;gluPerspective_ (45,1,0.1,1000)
  glMatrixMode_ (#GL_modelview)
	glShadeModel_(#GL_SMOOTH)
	glClearStencil_(0)
	glEnable_(#GL_DEPTH_TEST)
	glDepthFunc_(#GL_LEQUAL)
	glHint_(#GL_PERSPECTIVE_CORRECTION_HINT, #GL_NICEST)
	glEnable_(#GL_TEXTURE_2D)
  glClearColor_( 0.0, 0.0, 0.0, 0.0)
  glEnable_ (#GL_COLOR_MATERIAL)
  
	glLightfv_(#GL_LIGHT0, #GL_AMBIENT, *LightAmb)
	glLightfv_(#GL_LIGHT0, #GL_DIFFUSE, *LightDif)
	glLightfv_(#GL_LIGHT0, #GL_POSITION, *LightPos)

	glEnable_(#GL_LIGHT0)
	glEnable_(#GL_LIGHTING)
EndProcedure

Procedure OpenGLScreen(*p.GLscreen,x,y,w,h)
  If *p
    container = ContainerGadget(#PB_Any,x,y,w,h)
    If container
      hwnd = GadgetID(container)
      pfd.PIXELFORMATDESCRIPTOR
      hdc = GetDC_(hwnd)
      pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
      pfd\nVersion = 1
      pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
      pfd\iLayerType = #PFD_MAIN_PLANE
      pfd\iPixelType = #PFD_TYPE_RGBA
      pfd\cColorBits = 24
      pfd\cDepthBits = 16
      pixformat = ChoosePixelFormat_(hdc, pfd)
      SetPixelFormat_(hdc, pixformat, pfd)
      hrc = wglCreateContext_(hdc)
      wglMakeCurrent_(hdc, hrc)
      SwapBuffers_(hdc)
      *p\container = container
      *p\hWnd      = GadgetID(container)
      *p\hDC       = hdc
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure
Im thread vorher habe ich eine Frage um ein Bild einzulesen mit durchsichtigen schwarzen Hintergrund, kannst du mal schauen und eine Vorschlag machen ?
Antworten