[D3D10] Probleme beim Rendern eines Farbigen Dreiecks

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Tactive
Beiträge: 61
Registriert: 21.07.2004, 15:10
Kontaktdaten:

[D3D10] Probleme beim Rendern eines Farbigen Dreiecks

Beitrag von Tactive »

Hallo,

habe heute versucht per HLSL ein Dreicek mit drei unterschiedlich colorierten Vertices zu rendern. Dazu habe ich den Code erweitert, der ein Dreieck in einer bestimmten Farbe rendert. Irgendwie zeigt wird in der Ausgabe aber nun nichts angezeigt?? Ich habe schon alles Kontrolliert und angepasst, aber es wird einfach nichts angezeigt. Wäre toll wenn mal jeman über meinen Code schauen und mir Tipps geben könnte.

Code der Headerdatei:

Code: Alles auswählen

#pragma once

#include "SimpleTriangleRenderer.h"

struct ColoredVertex
{
	D3DXVECTOR3 Pos;
	D3DXCOLOR	Color;
};

class ColoredTriangleRenderer : public SimpleTriangleRenderer
{
public:
	ColoredTriangleRenderer(IUnknownHolder<ID3D10Device>& d3dDevice);
	virtual ~ColoredTriangleRenderer();

	void Init();
	void Render();
};
Und die Implementierung der Header-Datei:

Code: Alles auswählen

#include "ColoredTriangleRenderer.h"

LOG_USE();

ColoredTriangleRenderer::ColoredTriangleRenderer(IUnknownHolder<ID3D10Device> &d3dDevice)
	: SimpleTriangleRenderer(d3dDevice)
{

}

ColoredTriangleRenderer::~ColoredTriangleRenderer()
{
}

void ColoredTriangleRenderer::Init()
{
	BaseRenderer::Init();

	// Compile effect file and check for errors
	///////////////////////////////////

#ifdef _DEBUG
	const UINT hslFlags = D3D10_SHADER_DEBUG;
#else
	const UINT hslFlags = D3D10_SHADER_ENABLE_STRICTNESS;
#endif

	ID3D10Blob*	errors = NULL;

	if (FAILED(D3DX10CreateEffectFromFile(L"../DX10Experience/Shader/ColoredShader.fx", NULL, NULL, "fx_4_0", hslFlags,
		0, m_device, NULL, NULL, &m_defaultEffect, &errors, NULL)) || errors)
	{
		if (errors)
		{
			char* compileErrors = static_cast<char*>(errors->GetBufferPointer());
			LOG_FATAL(compileErrors);
			::OutputDebugStringA(compileErrors);
			throw Exception("Unable to load and compile default shader file");
		}

		throw Exception("Unable to load shader file (file is missing or has errors)");
	}

	// Get reference to shader technique
	///////////////////////////////////

	m_defaultTechnique = m_defaultEffect->GetTechniqueByName("DefaultTechnique");
	if (m_defaultTechnique == NULL)
		throw Exception("Unable to get reference to the shaders technique");

	// Create the layout of the structure
	///////////////////////////////////

	D3D10_INPUT_ELEMENT_DESC layout[] =
	{
		{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
		{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0 }
	};
	m_numElements = (sizeof(layout) / sizeof(layout[0]));

	// Create the input layout itself
	///////////////////////////////////

	D3D10_PASS_DESC pd;
	m_defaultTechnique->GetPassByIndex(0)->GetDesc(&pd);

	if (FAILED(m_device->CreateInputLayout(layout, m_numElements, 
		pd.pIAInputSignature, pd.IAInputSignatureSize, &m_inputLayout)))
		throw Exception("Unable to create the input layout");

	// Set the nput layout
	m_device->IASetInputLayout(m_inputLayout);

	// Create the vertex buffer
	///////////////////////////////////

	ColoredVertex vertices[] =
	{
		{ D3DXVECTOR3(0.0f, 0.5f, 0.5f), D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f) },
		{ D3DXVECTOR3(0.5f, -0.5f, 0.5f), D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) },
		{ D3DXVECTOR3(-0.5f, -0.5f, 0.5f), D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f) }
	};

	D3D10_BUFFER_DESC bd;
	bd.Usage			= D3D10_USAGE_DEFAULT;
	bd.ByteWidth		= (sizeof(ColoredVertex) * 3);
	bd.BindFlags		= D3D10_BIND_VERTEX_BUFFER;
	bd.CPUAccessFlags	= 0;
	bd.MiscFlags		= 0;

	D3D10_SUBRESOURCE_DATA initData;
	initData.pSysMem = vertices;
	if(FAILED(m_device->CreateBuffer(&bd, &initData, &m_vertexBuffer)))
		throw Exception("Unable to create vertex buffer");
}

void ColoredTriangleRenderer::Render()
{
	BaseRenderer::Render();

	// Set vertex buffer
	UINT stride = sizeof(ColoredVertex);
	UINT offset = 0;
	m_device->IASetVertexBuffers(0, 1, &m_vertexBuffer, &stride, &offset);

	m_device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

	D3D10_TECHNIQUE_DESC td;
	m_defaultTechnique->GetDesc(&td);

	for (UINT p = 0; p < td.Passes; ++p)
	{
		m_defaultTechnique->GetPassByIndex(p)->Apply(0);
		m_device->Draw(3, 0);
	}
}
Und so sieht dazugehörige Shader-Datei aus:

Code: Alles auswählen

/* ColoredShader.fx */

struct VS_DATA
{
	float4	position : POSITION;
	float4	color	 : COLOR0;
};

VS_DATA DefaultVS(VS_DATA dataIn)
{
	return dataIn;
}

float4 DefaultPS(VS_DATA dataIn) : SV_Target
{
	return dataIn.color;
}   

technique10 DefaultTechnique
{
	pass Pass0
	{
		SetGeometryShader(NULL);
		SetVertexShader(CompileShader(vs_4_0, DefaultVS()));
		SetPixelShader(CompileShader(ps_4_0, DefaultPS()));
	}
}
Im PixelShader habe ich schon testhalber die Rückgabe der Farbe gegen einen festen Wert überschrieben, aber es wird einfach nichts
angezeigt?? Ich habe keinen Plan was ich da verkehrt mache.
Benutzeravatar
Krishty
Establishment
Beiträge: 8241
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D10] Probleme beim Rendern eines Farbigen Dreiecks

Beitrag von Krishty »

Hi,
Tactive hat geschrieben:Dazu habe ich den Code erweitert, der ein Dreieck in einer bestimmten Farbe rendert.
Hat dieser zu Grunde liegende Code denn funktioniert? Das ging aus deinem Post nicht ganz hervor.

Ansonsten würde ich mal testen, ob in ColoredVertex ((char*)&Color - (char*)&Pos) == sizeof(Pos) gilt – oder kurz, ob der Compiler Pos nicht 128 Bytes groß gemacht hat, damit Color ausgerichtet ist.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Tactive
Beiträge: 61
Registriert: 21.07.2004, 15:10
Kontaktdaten:

Re: [D3D10] Probleme beim Rendern eines Farbigen Dreiecks

Beitrag von Tactive »

Hallo Krishty,

ja der ursprüngliche Code hat funktioniert. Habe wie gesagt das ganze dann "nur" mit der Farbe des Vertex erweitert. Die Größe in der Struktur scheint jedenfalls zu passen. Die Position ist 12 Bytes groß, die Farbe 16 Bytes und die gesamte Struktur hat 28 Bytes.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [D3D10] Probleme beim Rendern eines Farbigen Dreiecks

Beitrag von Schrompf »

Es liegt evtl. daran, dass Du in der VertexDeclaration das Attribut "COLOR" genannt hast, im Shader dagegen "COLOR0". in D3D10 sind das keine gleichwertigen Bezeichner mehr - man kann da jetzt beliebige Wörter zur Zuordnung benutzen, die dann aber exakt übereinstimmen müssen. Eigentlich müsste man dazu eine Fehlermeldung oder wenigstens eine Warnung bekommen, wenn ein Vertex-Attribut im Shader nicht gefüttert wird....
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Tactive
Beiträge: 61
Registriert: 21.07.2004, 15:10
Kontaktdaten:

Re: [D3D10] Probleme beim Rendern eines Farbigen Dreiecks

Beitrag von Tactive »

Konnte den Fehler noch nicht finden, wollte mich aber trotzdem für Eure Beiträge und Ratschläge danken. Ich werde mich wohl erstmal mehr mit Grundlagen der Shader und DirectX 10 beschäftigen, um besser zu verstehen was da abgeht. Zunächst werde ich mich aber mehr mit dem XNA Studio (Direct3D 9) auseinandersetzen, um doch mal voranzukommen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8241
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D10] Probleme beim Rendern eines Farbigen Dreiecks

Beitrag von Krishty »

Wie ich das hasse. Die ersten hundert Zeilen, bis man was auf dem Bildschirm sieht, sind die schwierigsten … ich habe bestimmt auch schon zwei oder drei Projekte gehabt, die ums Verrecken nichts rendern wollten. Komplett neu geschrieben, dann ging’s. Ich bin deshalb dazu übergegangen, existierende Projekte zu beschneiden und durch den neuen Code zu ersetzen, so, dass der Bildschirm nie leer bleibt. Kontraintuitiv zwar, aber fürs Debugging und für die Nerven ein Segen …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten