Как правильно расшарить текстуру из DX12 в OpenGL?C++

Программы на C++. Форум разработчиков
Anonymous
 Как правильно расшарить текстуру из DX12 в OpenGL?

Сообщение Anonymous »

В обычных обстоятельствах создание общего дескриптора в DX с помощью CreateSharedHandle, а затем использование glImportMemoryWin32HandleEXT в OpenGL должно разрешить совместное использование. Я попробовал визуализировать треугольник в DX и отобразить его в OpenGL. Когда я проверил вывод DX с помощью RenderDoc, все выглядело нормально, но в OpenGL отображается только ClearColor, а треугольник отсутствует. Хотя я подозреваю, что это может быть проблема с синхронизацией, я уже установил ограничение в DX. Каков правильный процесс обмена текстурами?

Это результат вывода DX, который я нашел в RenderDoc:
введите здесь описание изображения
Однако текстура, полученная с помощью OpenGL, выглядит следующим образом:
введите здесь описание изображения
#include
#include
#include "d3dx12.h"
#include

#include
#include

#include
#include

#define _DEBUG
//#define _DXRENDERDOC

#ifdef _DXRENDERDOC
#include "renderdoc_app.h"
#endif

using Microsoft::WRL::ComPtr;

#pragma comment(lib, "d3d12.lib")
#pragma comment(lib, "d3dcompiler.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glew32.lib")

ComPtr d3d12Device;
ComPtr commandQueue;
ComPtr commandAllocator;
ComPtr commandList;
ComPtr fence;
UINT64 fenceValue = 0;

ComPtr rootSignature;
ComPtr pipelineState;
ComPtr vertexBuffer;
D3D12_VERTEX_BUFFER_VIEW vertexBufferView;

HANDLE sharedHandle;
ComPtr sharedTexture;

GLuint glTexture;
GLuint glMemoryObject;
GLFWwindow* window;
GLuint quadVAO, quadVBO;
GLuint shaderProgram;

struct Vertex {
float position[3];
float color[3];
};

const char* vertexShaderSrc = R"(
struct VSInput {
float3 position : POSITION;
float3 color : COLOR;
};

struct PSInput {
float4 position : SV_POSITION;
float3 color : COLOR;
};

PSInput main(VSInput input) {
PSInput output;
output.position = float4(input.position, 1.0);
output.color = input.color;
return output;
}
)";

const char* pixelShaderSrc = R"(
struct PSInput {
float4 position : SV_POSITION;
float3 color : COLOR;
};

float4 main(PSInput input) : SV_TARGET {
return float4(input.color, 1.0);
}
)";

const char* oglVertexShaderSrc = R"(
#version 450 core
layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec2 inTexCoord;
out vec2 TexCoord;
void main()
{
TexCoord = inTexCoord;
gl_Position = vec4(inPosition, 0.0, 1.0);
}
)";

const char* oglFragmentShaderSrc = R"(
#version 450 core
in vec2 TexCoord;
out vec4 FragColor;
uniform sampler2D sharedTexture;
void main()
{
FragColor = texture(sharedTexture, TexCoord);
}
)";

void InitD3D12();
void CreateRootSignature();
void CreateShadersAndPSO();
void CreateVertexBuffer();
void CreateSharedTexture();
void RenderTriangleToTexture();
void WaitForPreviousFrame();
void InitOpenGL();
void DisplayTexture();

void APIENTRY OpenGLDebugMessageCallback(GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length,
const GLchar* message, const void* userParam)
{
if (severity == GL_DEBUG_SEVERITY_HIGH) {
std::cerr

Подробнее здесь: https://stackoverflow.com/questions/790 ... -to-opengl

Вернуться в «C++»