Solo se me ocurrió la idea: necesitas encontrar algún tipo de pasatiempo. De lo contrario, puede alejarse de las bobinas. Y como soy una persona muy inútil, que no puede hacer nada más que apretar botones, el pasatiempo será este: al menos una vez a la semana, organice una secuencia con la escritura de un juguete. Después de una transmisión, el registro se publica en Habré. (Puedes intentar publicar en vivo en Habr, pero es mucho más difícil).
La escritura está muy impulsada por los comentarios: si alguien necesita una explicación, entonces puedo explicar cómo puedo. Si hay sugerencias, intentaré tenerlas en cuenta. En el habr, todos los comentarios se leen hasta el final, en otros lugares, cómo va.
El primer panqueque está lleno de bultos aquí:
Debajo de la escena hay una descripción de la tesis para aquellos que están justamente en quiebra para pasar una hora y media viendo.
Ideas orientadoras
El primer aspecto interesante es que quieres escribir todo sin novios. ¿Cómo lo hace un javista normal? Hay un problema: descubres una tristeza, dependiendo de ello, y resuelve el problema por ti. El precio de esto es que debido a tales cerdos, el proyecto se convierte en una pocilga, y nadie puede determinar exactamente qué está sucediendo. Me gustaría intentar escribir sin esta granja de cerdos, limpia y ordenada. Tal vez esto no sea posible, háganos saber en los comentarios.
El segundo aspecto. He codificado Java y PHP toda mi vida. Hubo experiencia en el desarrollo de juguetes, pero solo en la parte del servidor con una respuesta a través de la red, y no una sola vez: una aplicación de escritorio real en C ++. Por lo tanto, en esencia, este será un espectáculo de monstruos: una persona que no comprende el problema intentará de alguna manera describir con sus propias palabras lo que está sucediendo.
No, todo esto no tiene valor práctico. Esto es para no salir de las bobinas y motivar a los tíos barbudos adultos a que también agarren el teclado y corten algunos juguetes.
La rutina golpea un centavo
Desafortunadamente, la programación nunca comienza con un entretenimiento fácil y agradable. Inicialmente, hay un período de excavación dolorosa en el entorno y la configuración de IDE.
Lo primero que entendí acerca de Visual Studio es una gran herramienta para un profesional, pero causa una impresión muy frustrante en un principiante. Después de Eclipse e IntelliJ IDEA, todo, ya sabes, es una especie de desesperanza poco natural, lila, con una re-puerta. No se trata de VS en absoluto, se trata de mí :-)
Y con los complementos siempre hay algún tipo de problema.

Por lo tanto, por una decisión deliberada, abandonamos Vizhualka y vemos qué más es. Vim, Emacs y otros editores que no entienden la estructura fuente son enviados por el bosque. El primer intento de usar Eclipse falló, por lo que la herramienta se eligió CLion .
El problema con CLion es que todavía no puede funcionar completamente con el compilador de Visual Studio. Si intentas hacer algo en él, se verá así:

Por supuesto, habría un hilo para encontrarse con los goshniks y comenzar a gritar con voz aguda que hay suficientes huellas de depuración para todos. Pero no los escucharemos, por supuesto.
Por lo tanto, necesita lo que CLion puede hacer bien, y esto es MinGW.
Elegir MinGW
Hay una tabla de versión grande.

Y muestra que tiene sentido mirar solo a Cygwin y Msys2. Msys2 es un poco extraño: tiene pocos confirmadores, los paquetes están en el github personal de uno de los autores. Por otro lado, es realmente genial: hay un compilador nuevo y un montón de paquetes. Esto es crucial
La instalación consiste en llamar a next-next-ok, y luego ejecutar repetidamente el comando de actualización ( pacman -Syu
, como en Archlinux) con reiniciar el terminal Msys2 hasta que diga que todo salió de la mejor manera posible.
Si simplemente instala Msys2 de acuerdo con las instrucciones e intenta agregarlo a CLion, no se encontrará ninguna cadena de herramientas. pacman -S mingw-w64-x86_64-toolchain
instalarlo usted mismo, esto se hace mediante el pacman -S mingw-w64-x86_64-toolchain
.
Después de instalar este paquete, CLion lanza helloworld (que se genera automáticamente al crear un nuevo proyecto) y la depuración funciona en él.
Comprobación de características # 1: una ventana simple
En primer lugar, quiero entender si al menos alguna aplicación de escritorio se iniciará. Aún así, este no es el PlatformSDK nativo, sino MinGW.
Para esto, es adecuado un programa simple que dibuje una ventana usando vinapi.
Y sí, con MinGW comienza. Pero con la cadena de herramientas de Visual Studio, arroja algún tipo de error, pero no me ocupé de ellos, porque, pero ¿por qué, si la plataforma de destino ya funciona para nosotros?
Comprobación de características # 2: Triángulo con sombreador
Está claro que para escribir algo viable no es suficiente mostrar píxeles en la ventana. Es frenado, incómodo, no hay cosas elegantes. En resumen, necesitamos DirectX.
La pregunta clave sobre CLion + MinGW es esta. Si no pueden usar DirectX, se envían a la papelera.
Para las pruebas, se buscó en Google un tutorial muy breve , que consta de solo dos archivos: en uno, todo el código C ++, en el otro, un sombreador. El desafío es hacerlo funcionar.
Además de la naturaleza de un solo archivo, este tutorial es muy bueno porque le dice a los dedos cómo funciona. Quizás este artículo debería transferirse a Habr (escribir en los comentarios).
El resultado final está aquí GitHub . Aquí describiré qué problemas se han encontrado.
Pequeñas cosas y basura
Muchas líneas L se han convertido en cadenas. Puede eliminar las letras L. En muchos lugares, debe reemplazar NULL con 0 para que no caiga.
A pesar de que set(CMAKE_CXX_STANDARD 17)
, no sucedió nada interesante a este respecto, nada se vino abajo.
Encabezados y Libs
El punto, por supuesto, es que este ejemplo es muy antiguo, escrito en los días anteriores a Windows 10. DirectX ya no está en un SDK de DirectX separado como en los días de nuestra controvertida juventud, sino que se inserta directamente en el SDK de Windows.
Por lo tanto, lo primero que debe hacer es ejecutar el instalador de Visual Studio y verificar que esté instalada la última versión del SDK de Windows.
La segunda pregunta está en los titulares.
#include <d3d11.h> #include <d3dx11.h> #include <d3dx10.h>
Ya no existen, necesitas algo como:
#include <d3d9.h> #include <d3d10.h> #include <d3d11.h> #include <dxgi.h>
Y luego, en CMakeLists, agregue una búsqueda al final del archivo:
set(LIBS d3d9 d3d11 d3dcompiler_43) target_link_libraries(src ${LIBS})
API faltantes
Anteriormente, existía tal estructura :
typedef struct D3DXCOLOR { FLOAT r; FLOAT g; FLOAT b; FLOAT a; } D3DXCOLOR, *LPD3DXCOLOR;
Y ella ya no está. Sin embargo, en todos los lugares donde realmente se necesitaba, resultó reemplazar D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f)
con {0.0f, 0.2f, 0.4f, 1.0f}
.
El problema resultó ser más interesante con el D3DX11CompileFromFile
. Ella no es más!
En el artículo Vivir sin D3DX, se propuso reemplazarlo con D3DCompileFromFile
.

Pero aquí está el problema, ¡ D3DCompileFromFile
tampoco está disponible por alguna razón!
Una pequeña investigación mostró que la documentación de Microsoft sugiere usar una versión muy nueva de la API:

Y MinGW nos devuelve al pasado durante varios años:

Sin embargo, en la versión de 32 bits hay un encabezado más nuevo, pero no entendí cómo agregarlo a 64 bits. 32 bits en, probablemente, en las FIG no se rindieron.
Por un lado, esto es muy triste, porque presagia una hemorragia en una relación con MinGW en el futuro. Me pregunto quiénes son los modales en todos estos asuntos.
Por otro lado, si tomamos el D3DCompile
faltante y el D3DCompileFromFile
actual:
HRESULT WINAPI D3DCompileFromFile( in LPCWSTR pFileName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs );
HRESULT WINAPI D3DCompile( in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in_opt LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs );
Resulta que solo existe la diferencia en lo siguiente:
in LPCWSTR pFileName,
en contra
in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName,
Desafortunadamente, no conozco C ++, así que le dije cómo podría: acabo de agregar la sustracción de archivos y redirigir estos datos a D3DCompile
.
void WINAPI D3DCompileFromFile(const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages) { SIZE_T data_size; char* buffer; ifstream infile; infile.open(filename, ios::binary); infile.seekg(0, ios::end); data_size = infile.tellg(); infile.seekg(0, ios::beg); buffer = new char[data_size]; infile.read(buffer, data_size); infile.close(); D3DCompile(buffer, data_size,filename, defines, include,entrypoint, target, sflags, eflags, shader, error_messages); }
La única diferencia importante entre el D3DX11CompileFromFile
y nuestro D3DCompileFromFile
hecho a D3DCompileFromFile
es la falta de un ID3DX11ThreadPump
como parámetro en la nueva API. ¿Es esto algo asincrónico, tal vez algún tipo de grupo de subprocesos? Sin embargo, no fue utilizado en el tutorial, hay 0 en su lugar.
Resumen
Un montón de DirectX + MinGW + Msys2 + CLion es lo suficientemente viable como para cortar un juego simple. Existe la oportunidad no solo de usar el vinapi básico, sino también de dibujar e incluso con sombreadores.
En general, eso es todo. Les recuerdo que el resultado simple yace en GitHub .
Recuerde que este no es mi código, sino un texto modificado del tutorial ; sin embargo, espero que su uso sea honesto y específico. Pero, sin embargo, es por eso que no hay una licencia normal allí .

Retroalimentación
Por favor escriba sus comentarios y sugerencias en los comentarios. Por el bien de esto, todo está hecho, escucha lo que dices. Especialmente si eres un programador experimentado, solo un bisonte, un bisonte, y no encajas en un hilo por tamaño. Asegúrese de entrar y escribir algo.
Les recuerdo que, como cualquier otro blogger, como "me gusta" y diseños. Cuanto más violentamente toques la flecha hacia arriba debajo de esta publicación, más probable será que salga la siguiente publicación y transmisión.
© Alexander Raevsky