IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Création des buffers [Débutant(e)] [DirectX 11]


Sujet :

DirectX

  1. #1
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut Création des buffers
    Bonjour à tous,

    J'ai un soucis avec mon programme. Quand j'appel drawIndexed, j'ai un accès mémoire illégal.

    D'après ce que j'ai compris, ça viendrait de ma manière d'initialiser les buffers qui n'est pas bonne.

    Voilà le code que j'utilise pour initialiser les buffers (un cube):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    //-------------------------------------------------------------
    void MeshData::buildD3DBuffer(MeshData& _data)
    {
    	ID3D11Device& d3dDevice = SE_RENDER_MANAGER()->getDevice();
     
    	//Build the vertex buffer
    	D3D11_BUFFER_DESC bDesc;
    	D3D11_SUBRESOURCE_DATA initData;
     
    	bDesc.Usage = D3D11_USAGE_IMMUTABLE;
    	bDesc.ByteWidth = sizeof(Vertex) * _data.m_vertices.size();
    	bDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    	bDesc.CPUAccessFlags = 0;
    	bDesc.MiscFlags = 0;
    	bDesc.StructureByteStride = 0;
    	initData.pSysMem = &_data.m_vertices[0];
    	HR(d3dDevice.CreateBuffer(&bDesc, &initData, &_data.m_VertexBuffer));
     
    	//Build the index buffer
    	ZeroMemory(&bDesc, sizeof(D3D11_BUFFER_DESC));
    	ZeroMemory(&initData, sizeof(D3D11_SUBRESOURCE_DATA));
     
    	bDesc.Usage = D3D11_USAGE_IMMUTABLE;
    	bDesc.ByteWidth = sizeof(unsigned) * _data.m_indices.size();
    	bDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    	bDesc.CPUAccessFlags = 0;
    	bDesc.MiscFlags = 0;
    	bDesc.StructureByteStride = 0;
    	initData.pSysMem = &_data.m_indices[0];
    	HR(d3dDevice.CreateBuffer(&bDesc, &initData, &_data.m_IndexBuffer));
    }
    A cet endroit, tout à l'air correct, d'où mon incompréhension. Il est possible que mon erreur vienne de l'utilisation du shader, mais j'aurais déjà voulu savori si l'erreur pouvait venir d'ici..

    Pour info, voilà le code qui dessine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    void	RenderManager::drawNode(Node* _node)
    {
    	if (!_node )
    		return;
     
    	Log::d("RENDERMANAGER") << "Rendering " << _node->getName();
     
    	if (!m_currentCamera )
    		return;
     
    	if ( _node->isDrawable() )
    	{
    		XMMATRIX globalTransform = _node->getTransformationMatrix();
    		MeshData* data = _node->getMeshData();
     
    		unsigned int stride = sizeof(Vertex);
    		unsigned int offset = 0;
     
     
    		//Set shader (TEST)
    		Shader* sh = SE_SHADER_MANAGER()->getShader(L"Data/fx/color.fx");
    		assert(sh);
    		m_d3dImmediateContext->IASetInputLayout(sh->getInputLayout());
    		m_d3dImmediateContext->IASetVertexBuffers(0, 1, &data->m_VertexBuffer, &stride, &offset);
    		m_d3dImmediateContext->IASetIndexBuffer(data->m_IndexBuffer, DXGI_FORMAT_R32_UINT, 0);
     
     
    		D3DX11_TECHNIQUE_DESC techDesc;
    		HR(sh->getTechnique()->GetDesc(&techDesc));
    		for(UINT p = 0; p < techDesc.Passes; ++p)
    		{
    			HR(sh->getTechnique()->GetPassByIndex(p)->Apply(0, m_d3dImmediateContext));
    			m_d3dImmediateContext->DrawIndexed(data->m_indices.size()-1, 0, 0);
    		}
    	}
     
    	if ( _node->isTranscient())
    	{
    		for (unsigned i = 0; i < _node->getNumChild(); ++i)
    		{
    			drawNode(_node->getChild(i));
    		}
    	}
    }
    J'ai donc besoin de vous pour me dire ce qui vous choque dans ma manière de faire ou me conseiller sur une méthode permettant de trouver d'où proviens l'erreur.

    Merci d'avance.
    Seeme

  2. #2
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    Après analyse avec PIX, ce serait ma manière d'associer le shader qui n'est pas bonne:

    D3D11: ERROR: ID3D11DeviceContext:raw: A Vertex Shader is always required when drawing, but none is currently bound. [ EXECUTION ERROR #341: DEVICE_DRAW_VERTEX_SHADER_NOT_SET ]
    D3D11: ERROR: ID3D11DeviceContext:raw: Rasterization Unit is enabled (PixelShader is not NULL or Depth/Stencil test is enabled and RasterizedStream is not D3D11_SO_NO_RASTERIZED_STREAM) but position is not provided by the last shader before the Rasterization Unit. [ EXECUTION ERROR #362: DEVICE_DRAW_POSITION_NOT_PRESENT ]
    An unhandled exception occurred.

  3. #3
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    Bien, il s'agissait d'une erreur de version dans le code du shader..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 16/08/2005, 14h43
  2. Réponses: 7
    Dernier message: 22/02/2005, 13h07
  3. Réponses: 3
    Dernier message: 24/10/2003, 21h46
  4. Réponses: 8
    Dernier message: 03/09/2003, 00h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo