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

21

04.08.2013, 12:34

Shader.cpp


#include "wasdShader.h"
#include <D3DX11.h>
#include <string>
#include "Declarations.h"
#include <iostream>

using namespace wasd;

wasdShader::wasdShader(wasdDevice* device)
{
ID3D10Blob *VS, *PS;
D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0);
D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0);

if(!VS | !PS)
{
MessageBox(NULL, L"Fehlende Shaderdatei.\nshader.hlsl Datei muss in \\wasdEngine\\testGame\\ liegen", L"Error", MB_OK | MB_ICONERROR);
exit(0);
}

// encapsulate both shaders into shader objects
device->createVertexAndPixelShader(&(*VS), &(*PS), &(*pVS), &(*pPS));

VS->Release();
PS->Release();

std::cout<<"Initialisierung des wasdShaders erfolgreich"<<std::endl;
}

wasdShader::~wasdShader()
{
pPS->Release();
pVS->Release();
}


wasdEngine.cpp

#include "..\shared\wasdEngine.h"
#include <string>
#include <stdio.h>
#include "Declarations.h"
#include <iostream>

using namespace wasd;

wasdEngine::wasdEngine(int width, int height, bool fullscreen, char* title)
{
wasdEngine::width = width;
wasdEngine::height = height;
//SDL initialisieren
SDL_Init(SDL_INIT_VIDEO);
//Erzeugung der SDL_Surface
if(fullscreen)
{
screen = SDL_SetVideoMode(width, height, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
}
else
{
screen = SDL_SetVideoMode(width, height, 32,SDL_HWSURFACE | SDL_DOUBLEBUF);
}
if(!screen)
{
MessageBox(NULL, L"Erstellung der SDLSurface fehlgeschlagen", L"Error", MB_ICONERROR | MB_OK);
exit(0);
}
else
{
std::cout<<"Initialisierung der SDLSurface erfolgreich\n";
}
SDL_WM_SetCaption(title, title);
SDL_SysWMinfo wminfo;
SDL_VERSION(&wminfo.version);
SDL_GetWMInfo(&wminfo);
hWnd = wminfo.window;

//wasdDevice erzeugen
device = new wasdDevice(hWnd, fullscreen, width, height);
if(!device)
{
MessageBox(NULL, L"Erstellung des wasdDevices fehlgeschlagen", L"Error", MB_ICONERROR | MB_OK);
exit(0);
}

//Shader erzeugen
shader = new wasdShader(&(*device));
if(!shader)
{
MessageBox(NULL, L"Erstellung des wasdShaders fehlgeschlagen", L"Error", MB_ICONERROR | MB_OK);
exit(0);
}
}

wasdEngine::~wasdEngine()
{
delete shader;
delete device;

/*if(models.size() != 0)
{
for(int i = 0; i < models.size(); i++)
{
models->~wasdModel();
}
}
for(int i = 0; i< objects.size(); i++)
{
objects[i]
}*/
SDL_FreeSurface(screen);
SDL_Quit();
}

HWND wasdEngine::getHWND()
{
return hWnd;
}

int wasdEngine::getWidth()
{
return width;
}

int wasdEngine::getHeight()
{
return height;
}

void wasdEngine::doRenderLoop()
{
SDL_Event event;
bool running = true;

while(running)
{
device->RenderFrame();
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT: running = false; break;
}
}
}
}


Kann keine Code tags benuztzen sonst formatiert er es komisch

22

04.08.2013, 13:31

Wow.

1. Warum erst deref und dann wieder die Adressen?

C-/C++-Quelltext

1
device->createVertexAndPixelShader(&(*VS), &(*PS), &(*pVS), &(*pPS));


2. Dein Fehler liegt in der oben erwähnten Methode. Benutze den Debugger, spring in diese Funktion und vergleiche nach dem Verlassen die Adressen in pVS und pPS mit denen, die du erwartest.

PS: Quelltext funktioniert, wenn du beim bearbeiten oben auf Quellcode drückst.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

FSA

Community-Fossil

  • Private Nachricht senden

23

04.08.2013, 14:24

Die Zeile:
shader = new wasdShader(&(*device));
ist auch Mist.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

24

04.08.2013, 18:13

@Steef
das mit dem defref und den Adressen kam daher, das ich es erst anders hatte (nur VS, PS, ...) aber es nicht funktioniert hat. Das man mit Quelltekt den Quelltext anschaltet weiß ich auch, das Problem ist die absolut unleserliche Formatierung, die dabei herauskommt.

@FSA
Selber Grund wie bei device->CreateVertex...

@Steef
Zu 2.: nach dem Erstellen haben beide Zeiger den Inhalt 0xcdcdcdcd
Was bedeutet das? Fehler beim Erstellen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

25

04.08.2013, 18:17

Im Debug-Build werden nicht initialisierte Zeiger von vielen Compilern auf 0xCDCDCDCD gesetzt.
Das soll dir helfen diese Fälle zu erkennen. Im Release-Build zeigen diese Zeiger mehr oder weniger zufällig irgendwohin.

26

04.08.2013, 18:26

Ich dachte, das die durch diese Createmethode irgendwas übergebenbekommen, was bringen die denn sonst?

Ich hab mal den Quellcode der Hauptdateien hochgeladen: Github

@David Scherfgen
Ihr Buch hat mir bis her sehr geholfen, danke.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

27

04.08.2013, 19:28

Ich dachte, das die durch diese Createmethode irgendwas übergebenbekommen, was bringen die denn sonst?

Das tun sie auch. Du bekommst aber in createVertexAndPixelShader die Zeiger als Kopie und setzt damit nicht die ursprünglichen Zeiger. Dafür müsstest du Doppelzeiger verwenden, so wie DX das auch macht,

28

05.08.2013, 11:04

Danke für die Hilfe, ich habe das Problem jetzt gelöst.

Meine createVertexAndPixelShader - Funktion sieht jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void wasdDevice::createVertexAndPixelShader(ID3D10Blob** VS, ID3D10Blob** PS, ID3D11VertexShader** pVS, ID3D11PixelShader** pPS)
{
    dev->CreateVertexShader((*VS)->GetBufferPointer(), (*VS)->GetBufferSize(), NULL, pVS);
    dev->CreatePixelShader((*PS)->GetBufferPointer(), (*PS)->GetBufferSize(), NULL, pPS);

    devcon->VSSetShader((*pVS), 0, 0);
    devcon->PSSetShader((*pPS), 0, 0);
}


Und der Aufruf sieht so aus:

C-/C++-Quelltext

1
device->createVertexAndPixelShader(&VS, &PS, &pVS, &pPS);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SuperManitu« (05.08.2013, 11:11)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

29

05.08.2013, 11:08

VS und PS musst Du nicht als Doppelpointer übergeben. Macht ja offenbar keinen Sinn.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

30

05.08.2013, 11:10

oh ja stimmt.

Werbeanzeige