Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL] Problem z nakładaniem się obrazu.

Ostatnio zmodyfikowano 2014-09-27 16:39
Autor Wiadomość
bobek784
Temat założony przez niniejszego użytkownika
[OpenGL] Problem z nakładaniem się obrazu.
» 2014-09-15 18:01:52
Witam,
Zrobiłem program składający się z kilku formularzy jednym głównym z przyciskami wyświetlającymi pozostałe formularze, w których umieściłem okienka opengl, podobnie jak to jest pokazane w tym artykule:
http://www.codeproject.com​/Articles/16051​/Creating-an-OpenGL-view-on-a-Windows-Form

W każdym z okien renderowany jest inny obraz, który użytkownik może modyfikować przy użyciu kontrolek, jednak po kilku otwarciach i zamknięciach tych formularzy obrazy zaczynają się mieszać i mrugać. Myślałem, że problemem jest użycie tego samego pliku .h do renderowania scen (jeden plik .h ale każdy formularz wywoływał inną jego funkcję), jednak przerobienie programu tak, żeby każdy formularz miał własny plik .h, w którym jest kod opengl odpowiedzialny za renderowanie seny nic nie dało. Próbowałem też przy zamknięciu okna czyścić bufor, zerować wartości, zatrzymywać timer, ale nic nie przynosi efektów :/ Może ktoś się już spotkał z takim problemem albo ma jakiś pomysł, co może pomóc?


Przy próbie zrobienia screena, widnieje na nim tylko jedna z figur. Czyli działa tak, jakby je renderowało na zmianę :/ Wygląda to tak, jakby timer, który robi za pętlę działał jak nieskończona pętla, tyle że wyłączenie go przy zamykaniu formularza nie pomaga :/
P-117043
Monika90
» 2014-09-15 18:57:28
Przed rysowaniem w danym oknie należy ustawić jako bieżący kontekst OpenGL związany z tym oknem. Robi się to za pomocą funkcji wglMakeCurrent.
P-117047
bobek784
Temat założony przez niniejszego użytkownika
» 2014-09-15 20:46:35
Dzięki, a mogłabyś mi jeszcze powiedzieć, w którym miejscu umieścić tą funkcję w podanym przykładzie z linka? I czy jeśli wszystkie funkcje renderowania znajdują się w tym samym pliku opengl.h to nie będzie problemu?
P-117054
Monika90
» 2014-09-15 21:52:47
Nie wiem gdzie umieśćić bo nie pokazałeś kodu. Przypuszczam że wystarczy dodać
C/C++
wglMakeCurrent( m_hDC, m_hglrc );
na początku funkcji Render
P-117058
bobek784
Temat założony przez niniejszego użytkownika
» 2014-09-18 13:18:32
Niestety nic nie pomaga :/ ale zauważyłem nowy objaw: czym dłużej/częściej debuguje program, tym bardziej obciążona jest karta graficzna, nawet jak pozamykam wszystkie programy, obciążenie nie znika, więc może w tym gdzieś leży problem, że karta cały czas renderuje scenę mimo zamknięcia programu? To możliwe?

Mam praktycznie taki sam kod jak na tej stronie tylko do Opengl.h dodałem funkcje render2, render3... i w każdej formie wywołuję inną funkcje render.
P-117144
Monika90
» 2014-09-18 14:04:06
Nie ma kodu, nie ma odpowiedzi.
P-117147
bobek784
Temat założony przez niniejszego użytkownika
» 2014-09-25 13:25:34
To kod:
Opengl.h

C/C++
pragma once

#include <windows.h>
#include <gl\GL.h>
#include <stdio.h>
#include <gl\GLU.h>
#include <string>
#include <gl\glut.h>
#include <gl\glaux.h>


using namespace System::Windows::Forms;
using namespace std;
using namespace System;

namespace OpenGLForm
{
    public ref class COpenGL
: public System::Windows::Forms::NativeWindow
    {
    public:
        COpenGL( System::Windows::Forms::Form ^ parentForm, GLsizei iWidth, GLsizei iHeight )
        {
            CreateParams ^ cp = gcnew CreateParams;
           
            cp->X = 100;
            cp->Y = 100;
            cp->Height = iWidth;
            cp->Width = iHeight;
            cp->Parent = parentForm->Handle;
            cp->Style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
            this->CreateHandle( cp );
            m_hDC = GetDC(( HWND ) this->Handle.ToPointer() );
            if( m_hDC )
                 MySetPixelFormat( m_hDC );
           
        }
       
        System::Void Render( int c, int p, float w, int r )
        {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
            glLoadIdentity();
            glTranslatef( 0.0f, 0.0f, - 6.0f );
           
            if( r == 1 )
            {
                glRotatef( rtri, 0.0f, 1.0f, 0.0f );
            } else if( r == 2 ) {
                glRotatef( rtri, 1.0f, 0.0f, 0.0f );
            } else if( r == 3 ) {
                glRotatef( rtri, 1.0f, 1.0f, 0.0f );
            } else {
                rtri = 0;
            };
           
            switch( c )
            {
            case 1:
                Punkty( p, w );
                break;
            case 2:
                Linie( p );
                break;
            case 3:
                Linie2( p );
                break;
            case 4:
                Linie3( p );
                break;
            case 5:
                Trojkaty( p );
                break;
            case 6:
                Trojkaty2( p );
                break;
            case 7:
                Trojkaty3( p );
                break;
            case 8:
                Czworokaty( p );
                break;
            case 9:
                Czworokaty2( p );
                break;
            case 10:
                Poligony( p );
                break;
            }
           
            rtri += 0.2f;
            glFlush();
        }
        System::Void Render2( int a, int b, int r2, float c1a, float c1b, float c1c, float c2a, float c2b, float c2c, float c3a, float c3b, float c3c, float c4a, float c4b, float c4c )
        {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
            glLoadIdentity();
            glTranslatef( 0.0f, 0.0f, - 6.0f );
            if( r2 == 1 )
            {
                glRotatef( rtri, 0.0f, 1.0f, 0.0f );
            } else if( r2 == 2 ) {
                glRotatef( rtri, 1.0f, 0.0f, 0.0f );
            } else if( r2 == 3 ) {
                glRotatef( rtri, 1.0f, 1.0f, 0.0f );
            } else {
                rtri = 0;
            };
           
            switch( a )
            {
            case 1:
                glColor3f( c1a, c1b, c1c );
                if( b == 1 )
                {
                    glBegin( GL_TRIANGLES );
                    glVertex3f( 0.0f, 1.0f, 0.0f );
                    glVertex3f( 1.0f, - 1.0f, 0.0f );
                    glVertex3f( - 1.0f, - 1.0f, 0.0f );
                    glEnd();
                } else if( b == 2 )
                {
                    glBegin( GL_QUADS );
                    glVertex3f( - 1.0f, 1.0f, 0.0f );
                    glVertex3f( 1.0f, 1.0f, 0.0f );
                    glVertex3f( 1.0f, - 1.0f, 0.0f );
                    glVertex3f( - 1.0f, - 1.0f, 0.0f );
                    glEnd();
                };
                break;
            case 2:
                if( b == 1 )
                {
                    glBegin( GL_TRIANGLES );
                    glColor3f( c1a, c1b, c1c );
                    glVertex3f( 0.0f, 1.0f, 0.0f );
                    glColor3f( c2a, c2b, c2c );
                    glVertex3f( 1.0f, - 1.0f, 0.0f );
                    glColor3f( c3a, c3b, c3c );
                    glVertex3f( - 1.0f, - 1.0f, 0.0f );
                    glEnd();
                } else if( b == 2 )
                {
                    glBegin( GL_QUADS );
                    glColor3f( c1a, c1b, c1c );
                    glVertex3f( - 1.0f, 1.0f, 0.0f );
                    glColor3f( c2a, c2b, c2c );
                    glVertex3f( 1.0f, 1.0f, 0.0f );
                    glColor3f( c3a, c3b, c3c );
                    glVertex3f( 1.0f, - 1.0f, 0.0f );
                    glColor3f( c4a, c4b, c4c );
                    glVertex3f( - 1.0f, - 1.0f, 0.0f );
                    glEnd();
                };
                break;
               
            }
           
            rtri += 0.2f;
            glFlush();
        }
       
        System::Void SwapOpenGLBuffers( System::Void )
        {
            SwapBuffers( m_hDC );
        }
       
    private:
        HDC m_hDC;
        HGLRC m_hglrc;
        GLfloat rtri;
       
    protected:
        ~COpenGL( System::Void )
        {
            this->DestroyHandle();
        }
       
        GLint MySetPixelFormat( HDC hdc )
        {
            PIXELFORMATDESCRIPTOR pfd = {
                sizeof( PIXELFORMATDESCRIPTOR ), // size of this pfd
                1, // version number
                PFD_DRAW_TO_WINDOW | // support window
                PFD_SUPPORT_OPENGL | // support OpenGL
                PFD_DOUBLEBUFFER, // double buffered
                PFD_TYPE_RGBA, // RGBA type
                24, // 24-bit color depth
                0, 0, 0, 0, 0, 0, // color bits ignored
                0, // no alpha buffer
                0, // shift bit ignored
                0, // no accumulation buffer
                0, 0, 0, 0, // accum bits ignored
                32, // 32-bit z-buffer    
                0, // no stencil buffer
                0, // no auxiliary buffer
                PFD_MAIN_PLANE, // main layer
                0, // reserved
                0, 0, 0 // layer masks ignored
            };
           
            GLint iPixelFormat;
           
            if(( iPixelFormat = ChoosePixelFormat( hdc, & pfd ) ) == 0 )
            {
                MessageBox::Show( "ChoosePixelFormat Failed" );
                return 0;
            }
           
            if( SetPixelFormat( hdc, iPixelFormat, & pfd ) == FALSE )
            {
                MessageBox::Show( "SetPixelFormat Failed" );
                return 0;
            }
           
            if(( m_hglrc = wglCreateContext( m_hDC ) ) == NULL )
            {
                MessageBox::Show( "wglCreateContext Failed" );
                return 0;
            }
           
            if(( wglMakeCurrent( m_hDC, m_hglrc ) ) == NULL )
            {
                MessageBox::Show( "wglMakeCurrent Failed" );
                return 0;
            }
           
           
            return 1;
        }
    };
}

Okno pierwsze:
C/C++
#include "opengl.h"
#include <string>
#include <msclr/marshal_cppstd.h>
#include <iostream>
#include <fstream>
#pragma once

namespace ProjektOpenGL {
   
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace OpenGLForm;
    using namespace std;
    using namespace System::Runtime::InteropServices;
    using namespace System::IO;
   
   
   
    /// <summary>
    /// Summary for My1okno
    /// </summary>
    public ref class My1okno
: public System::Windows::Forms::Form
    {
    public:
        My1okno( void )
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
            OpenGL = gcnew COpenGL( this, 500, 500 );
        }
       
    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~My1okno()
        {
            if( components )
            {
                delete components;
            }
        }
       
        (...)
       
       
        private
    : /// <summary> /// Required designer variable./// </summary> OpenGLForm::COpenGL ^ OpenGL;
        int a;
        int rotacja2;
        int b2;
        int a2;
        float c2;
        (...)
       
       
        #pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent( void )
        {
            (...)
        }
        #pragma endregion
       
    private: System::Void timer1_Tick( System::Object ^ sender, System::EventArgs ^ e ) {
            UNREFERENCED_PARAMETER( sender );
            UNREFERENCED_PARAMETER( e );
            int rotacja = 0;
            if( checkBox1->Checked && checkBox2->Checked ) {
                rotacja = 3;
            } else if( checkBox1->Checked ) {
                rotacja = 1;
            } else if( checkBox2->Checked ) {
                rotacja = 2;
            };
            int b =( int ) liczba1->Value;
            float c =( float ) liczba2->Value;
            OpenGL->Render( a, b, c, rotacja );
            OpenGL->SwapOpenGLBuffers();
            rotacja = 0;
        }
Okno drugie tak samo tylko tam wywołuję funkcję:
C/C++
OpenGL->Render2( a, b, rotacja, c1a, c1b, c1c, c2a, c2b, c2c, c3a, c3b, c3c, c4a, c4b, c4c );

Z karty nie znika obciążenie nawet jak się wyłączy program, a obrazy po kilkakrotnym przełączeniu między oknami zaczynają na siebie zachodzić i migać.
P-117501
Monika90
» 2014-09-25 23:41:45
Jeżeli dopisanie
wglMakeCurrent( m_hDC, m_hglrc );
 na początku wszystkich Twoich funkcji Render nie rozwiązuje problemu, to ja niestety nie wiem co zrobić.
P-117575
« 1 » 2
  Strona 1 z 2 Następna strona