Я вызываю следующую функцию из DirectX:
d3dDevice->CreateBuffer( &ibd, &isrd, &Player::indexbuffer);
Индексный буфер объявляется следующим образом:
static const ComPtr<ID3D11Buffer> indexbuffer;
Компилятор выбрасывает:
Error 1 error C2664: 'HRESULT ID3D11Device::CreateBuffer(const D3D11_BUFFER_DESC *,const D3D11_SUBRESOURCE_DATA *,ID3D11Buffer **)' : cannot convert argument 3 from 'const Microsoft::WRL::ComPtr<ID3D11Buffer>' to 'ID3D11Buffer **'
Как мне сделать что-то подобное? Мне нужна только одна переменная буфера.
http://msdn.microsoft.com/en-us/library/windows/desktop/ff476501(v=vs.85).aspx
Player.h
#pragma once
#include "StructVertex.h"
#include "SquareVertices.h"
#include "WICTextureLoader.h"
using namespace Microsoft::WRL;
using namespace DirectX;
//using namespace DirectX;
class Player : public SquareVertices
{
public:
Player( ComPtr<ID3D11Device1> d3dDevice );
~Player();
void Initialize();
void Update();
float x;
float y;
float z;
float rotation;
float velocity;
static const ComPtr<ID3D11Buffer> vertexbuffer;
static const ComPtr<ID3D11Buffer> indexbuffer;
static const ComPtr<ID3D11ShaderResourceView> texture;
private:
const ComPtr<ID3D11Device1> d3dDevice;
};
Player.cpp
#include "pch.h"
#include "Player.h"
//const VertexPositionColor vertices[ ];
Player::Player( ComPtr<ID3D11Device1> d3dDevice )
:
x( 0.0f ),
y( 0.0f ),
rotation( 0.0f ),
velocity( 0.05f ),
d3dDevice( d3dDevice )
{}
Player::~Player( )
{
}
void Player::Initialize( )
{
// Create vertex buffer
D3D11_BUFFER_DESC bd = { 0 };
bd.ByteWidth = sizeof( VERTEX )* ARRAYSIZE( Player::vertices );
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA srd = { Player::vertices, 0, 0 };
d3dDevice->CreateBuffer( &bd, &srd, Player::vertexbuffer ); // doesn't work
// Create the index buffer
D3D11_BUFFER_DESC ibd = { 0 };
ibd.ByteWidth = sizeof( short )* ARRAYSIZE( Player::indices ); // doesn't work ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
D3D11_SUBRESOURCE_DATA isrd = { Player::indices, 0, 0 };
d3dDevice->CreateBuffer( &ibd, &isrd, Player::indexbuffer ); // doesn't work
// Load the texture
CreateWICTextureFromFile( d3dDevice.Get( ), nullptr, L"Wood.png", nullptr, Player::texture, 0 ); // doesn't work }
void Player::Update()
{
if( Keyboard::up )
y += velocity;
if( Keyboard::down )
y -= velocity;
if( Keyboard::left )
x -= velocity;
if( Keyboard::right )
x += velocity;
}
Задайте себе эти простые вопросы:
Static
? В C++ мы стараемся избегать static
переменных, поскольку они вносят много проблем: глобальное состояние, совместное использование и владение, порядок инициализации, срок службы, безопасность потоков и т.д. У вас действительно есть веские причины для этого в вашем классе Player
? Ни xyz
, ни rotation
и velocity
не static
. Итак, почему static
буферы?
Const
?Все "изменяющиеся" методы требуют, чтобы объекты передавались как неконстантные.
Подумайте об этом: CreateBuffer()
должен мутировать внутреннее состояние буфера для его инициализации: назначать поля, отправлять данные буфера на видеокарту и т.д. Но это не может, потому что это const
. Когда вы UpdateSubresource()
он также не сработает. То же самое с текстурой. Как бы вы загружали данные в объект только для чтения?
Так что цель const
Несса здесь? Если вы хотите, чтобы ресурсы D3D11 были неизменяемыми, просто объявите флаг D3D11_USAGE_IMMUTABLE
при инициализации.
Надеюсь, поможет.
&Player::indexbuffer
на самом деле является правильным способом получить адрес статического объекта-члена.
Как объясняется ваше сообщение об ошибке, проблема в том, что он имеет неправильный тип для функции CreateBuffer
, для чего требуется указатель типа ID3D11Buffer **
.
Использование ComPtr
в порядке, поскольку оно переопределяет оператор &
для возврата адреса внутреннего указателя, на который он удерживает.
Однако indexbuffer
объявляется как const
, но CreateBuffer()
ожидает указатель не const. Он обновляет указатель, указывая на новый возвращаемый объект буфера. Вызов &
в ComPtr<ID3D11Buffer>
const ComPtr<ID3D11Buffer>
возвращает указатель const ID3D11Buffer**
, который не является тем, что CreateBuffer()
.
Удалите const
. Вызов &
на неконстантном ComPtr<ID3D11Buffer>
вернет неконстантный ID3D11Buffer**
, что и CreateBuffer()
.
ComPtr
переопределяет оператор&
чтобы вернуть адрес внутреннего указателя, который он удерживает. Таким образом,ComPtr<ID3D11Buffer>::operator&()
возвращаетID3D11Buffer**
. Это не причина ошибки. Реальная причина в том, чтоindexbuffer
объявлен какconst
. Вам нужно избавиться от этого, чтобы позволитьCreateBuffer()
изменять содержимоеindexbuffer
.