Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2016, 17:04   #21
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Цитата:
Сообщение от Soyder Посмотреть сообщение
Добрый день. Хочу научится писать игры на андроид, но не знаю с чего начать.
Нужно смотреть видео инструкции, как опытные люди делают игру и запоминать их методологии. Потом качать чужие бесплатные игры с открытым исходным кодом и изучать их код. Например, я качаю с Asset Store финальные результаты туторов

Нужно изучать официальные туториалы и следить за выходом новых: http://unity3d.com/learn

Видео инструкции по Unity можно найти на этих ресурсах:
Лучше всего начать с этой видео инструкции: 2D Zombies Game Android and iOS Game Development with Unity

Ничего, что они на английском. Всё и так понятно, когда человек делает и вы видите результат

Книга на русском обязательная к прочтению: https://habrahabr.ru/company/piter/blog/272123/

На русском очень мало книг. Поэтому нужно читать на английском. Переводить можно с помощью translate.google.com

Переводы:
Оригиналы переводов:
  • 2015 - 06 - Unity in Action Multiplatform Game Development in C# with Unity 5 - Joe Hocking -> source code
  • 2015 - 06 - Animation Essentials - Alat Thorn -> source code
  • 2015 - 02 - Mastering Unity Scripting - Alan Thorn -> source code
  • 2013 - 06 - Unity Shaders and Effects Cookbook - Kenneth Lammers -> source code

Последний раз редактировалось 8Observer8; 18.05.2016 в 09:35.
8Observer8 вне форума Ответить с цитированием
Старый 17.05.2016, 17:05   #22
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Список всех книг в хронологическом порядке (год - месяц - название - автор -> исходники к книге)
  • 2016 - 03 - Unity 5.x Game AI Programming Cookbook -> source code
  • 2016 - 03 - Unity 5.x By Example - Alan Thorn -> source code
  • 2016 - 03 - Learning C# by Developing Games with Unity 5.x - Second Edition -> source code
  • 2016 - 02 - Unity.5.x Shaders and Effects Cookbook - Alan Zucconi, Kenneth Lammers -> source code
  • 2016 - 01 - Procedural Content Generation for Unity Game Development - Ryan Watkins -> source code
  • 2015 - 12 - Unity UI Cookbook - Francesco Sapio -> source code
  • 2015 - 12 - Unity 5 From Zero to Proficiency (Beginner) - Patrick Felicia -> amazon link
  • 2015 - 12 - Unity 5 Coroutines Beginner - Lucas Faustino -> amazon link
  • 2015 - 11 - Unity Game Development in 24 Hours, Sams Teach Yourself - Ben Tristem, Mike Geig -> amazon link
  • 2015 - 11 - Unity 5 Game Optimization - Chris Dickinson -> source code
  • 2015 - 11 - Building a Game with Unity and Blender -> source code
  • 2015 - 10 - Unity 5.x Cookbook - Matt Smith, Chico Queiroz -> source code
  • 2015 - 10 - Unity 5 Writing Cleaner Code Beginner - Lucas Faustino -> amazon link
  • 2015 - 10 - Unity 5 From Zero to Proficiency (Foundations) - Patrick Felicia -> amazon link
  • 2015 - 10 - Building an FPS Game with Unity - John P. Doran -> source code
  • 2015 - 09 - Unity Virtual Reality Projects - Jonathan Linowes -> source code
  • 2015 - 09 - Unity AI Game Programming - Second Edition - Ray Barrera -> source code
  • 2015 - 09 - Oculus Rift in Action - BinanGotit -> source code
  • 2015 - 09 - Learning Unity iOS Game Development - Kyle Langley -> source code
  • 2015 - 09 - Extending Unity with Editor Scripting - Angelo Tadres -> source code
  • 2015 - 08 - Unity 5 for Android Essentials - Valera Cogut -> source code
  • 2015 - 06 - Unity in Action Multiplatform Game Development in C# with Unity 5 - Joe Hocking -> source code
  • 2015 - 06 - Building Levels in Unity - Volodymyr Gerasimov -> source code
  • 2015 - 06 - Animation Essentials - Alat Thorn -> source code
  • 2015 - 05 - Getting Started with Unity 5 - Dr Edward Lavieri -> source code
  • 2015 - 04 - Learning Unity Android Game Development - Finnegan -> source code
  • 2015 - 02 - Unity 2D Game Development Cookbook - Claudio Scolastici -> source code
  • 2015 - 02 - Mastering Unity Scripting - Alan Thorn -> source code
  • 2015 - 01 - Unity 3D UI Essentials - Simon Jackson -> source code
  • 2014 - 12 - Unity Game Development Scripting - Kyle D'Aoust -> source code
  • 2014 - 12 - Unity AI Programming Essentials - Curtis Bennett, Dan Violet Sagmiller -> source code
  • 2014 - 11 - Unity Game Development Blueprints - John P. Doran -> source code
  • 2014 - 10 - Learning Unity Physics - K. Aava Rani -> source code
  • 2014 - 09 - Learning C Sharp Programming With Unity 3D - Alex Okita -> source code
  • 2014 - 09 - Beginning 3D Game Development with Unity 4 - Sue Blackman -> source code
  • 2014 - 08 - Mastering Unity 2D Game Development - Simon Jackson -> source code
  • 2014 - 08 - Learning Unity 2D Game Development by Example - Venita Pereira -> source code
  • 2014 - 07 - Introduction To Game Design, Prototyping, And Development -> link to amazon
  • 2014 - 06 - C# Game Programming Cookbook for Unity 3D - Jeff Murray -> source code
  • 2014 - 03 - Unity 2D Game Development - Dave Calabrese -> source code
  • 2014 - 03 - Creating E-Learning Games with Unity - David Horachek -> source code
8Observer8 вне форума Ответить с цитированием
Старый 15.11.2020, 12:18   #23
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

На данный момент актуальной является версия Qt 5.15.1. Первый пример данное темы не будет работать на этой версии. Дата публикации первого сообщения "15.09.2014". Подумать только, это 6 лет назад, и как же быстро летят года. Я публикую пример, который работает в Qt 5.15.1. Вам нужно создать новое приложение из Qt Creator. Во время создания выбрать приложение "Qt Widgets Application" > тип приложение Widget > убрать галочку "Generate Forms". Когда приложение будет создано, то удалите файлы Widget.h и Widget.cpp. В примере будет задействован только файл main.cpp. В файл main.cpp нужно копировать код ниже. В файл проекта (с расширение .pro) нужно добавить строку:
Цитата:
win32: LIBS += -lopengl32
Этот пример рисует треугольник. В качестве бонуса пример на WebGL и TypeScript, который можно запустить в браузере в один клик: https://plnkr.co/edit/gAfPR7ZIKjJXul...ain.ts&preview

Обратите внимание на строки:

Код:
#ifdef _WIN32
#include <windows.h>
extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001;
#endif
Эти строки кода нужны, чтобы пример запускался на ноутбуках, которые используют две видеокарты: маломощную и более мощную.

main.cpp

Код:
// Minimal OpenGL example that works on Notebook and Android
// Add to .pro file: win32: LIBS += -lopengl32

#ifdef _WIN32
#include <windows.h>
extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001;
#endif

#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>

class Widget : public QOpenGLWidget {
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr) : QOpenGLWidget(parent) { }
private:
    QOpenGLShaderProgram m_program;
    QOpenGLBuffer m_vertPosBuffer;

    void initializeGL() override {
        glClearColor(0.5f, 0.8f, 0.7f, 1.f);
        resize(400, 500);
        const char *vertShaderSrc =
                "attribute vec3 aPosition;"
                "void main()"
                "{"
                "    gl_Position = vec4(aPosition, 1.0);"
                "}";
        const char *fragShaderSrc =
                "void main()"
                "{"
                "    gl_FragColor = vec4(0.5, 0.2, 0.9, 1.0);"
                "}";
        m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, vertShaderSrc);
        m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, fragShaderSrc);
        m_program.link();
        m_program.bind();
        float vertPositions[] = {
            -0.5f, -0.5f, 0.f,
            0.5f, -0.5f, 0.f,
            0.f, 0.5f, 0.f
        };
        m_vertPosBuffer.create();
        m_vertPosBuffer.bind();
        m_vertPosBuffer.allocate(vertPositions, sizeof(vertPositions));
        m_program.bindAttributeLocation("aPosition", 0);
        m_program.setAttributeBuffer(0, GL_FLOAT, 0, 3);
        m_program.enableAttributeArray(0);
    }
    void paintGL() override {
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLES, 0, 3);
    }
    void resizeGL(int w, int h) override {
        glViewport(0, 0, w, h);
    }
};

#include "main.moc"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
Изображения
Тип файла: png c1298273de8142b78a8a8db4fe1febb7.TriangleInOneFile_Qt5OpenGLES20Cpp_500x500.png (5.9 Кб, 45 просмотров)

Последний раз редактировалось 8Observer8; 15.11.2020 в 12:41.
8Observer8 вне форума Ответить с цитированием
Старый 21.11.2020, 02:06   #24
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Такой же код, что и выше, но на PyQt5: https://rextester.com/LWYAU14361 Если нравится изучать Python, то сочетание PyQt5 + OpenGL + простые игры - это один из самых интересных путей изучения. Плюс можно писать неигровые приложения с интерактивной 3D (и/или 2D) графикой, сочетая с GUI на Qt. PyQt5 работает поверх Qt C++, поэтому работает довольно шустро.

triangle_pyqt5_opengles20.png

Код:
import sys
import numpy as np
from OpenGL import GL as gl
from PyQt5.QtWidgets import QOpenGLWidget, QApplication
from PyQt5.QtGui import (QOpenGLBuffer, QOpenGLShaderProgram,
    QOpenGLShader)
from PyQt5.QtCore import Qt

class OpenGLWidget(QOpenGLWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Triangle, PyQt5, OpenGL ES 2.0")
        self.resize(300, 300)
    def initializeGL(self):
        gl.glClearColor(0.5, 0.8, 0.7, 1.0)
        vertShaderSrc = """
            attribute vec3 aPosition;
            void main()
            {
                gl_Position = vec4(aPosition, 1.0);
            }
        """
        fragShaderSrc = """
            void main()
            {
                gl_FragColor = vec4(0.5, 0.2, 0.9, 1.0);
            }
        """
        program = QOpenGLShaderProgram(self)
        program.addShaderFromSourceCode(QOpenGLShader.Vertex, vertShaderSrc)
        program.addShaderFromSourceCode(QOpenGLShader.Fragment, fragShaderSrc)
        program.link()
        program.bind()
        vertPositions = np.array([
            -0.5, -0.5, 0.0,
            0.5, -0.5, 0.0,
            0.0, 0.5, 0.0], dtype=np.float32)
        self.vertPosBuffer = QOpenGLBuffer()
        self.vertPosBuffer.create()
        self.vertPosBuffer.bind()
        self.vertPosBuffer.allocate(vertPositions, len(vertPositions) * 4)
        program.bindAttributeLocation("aPosition", 0)
        program.setAttributeBuffer(0, gl.GL_FLOAT, 0, 3)
        program.enableAttributeArray(0)

    def paintGL(self):
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)
        gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)

def main():
    QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
    a = QApplication(sys.argv)
    w = OpenGLWidget()
    w.show()
    sys.exit(a.exec_())

if __name__ == "__main__":
    main()

Последний раз редактировалось 8Observer8; 21.11.2020 в 02:13.
8Observer8 вне форума Ответить с цитированием
Старый 26.11.2020, 19:54   #25
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Куб на Qt C++ и OpenGL:
Куб на PyQt5 и OpenGL 3.3: https://rextester.com/VIQC38551
Куб на PySide2 и OpenGL 3.3: https://rextester.com/OWJ98916
Изображения
Тип файла: png Cube_OpenGLES20_Qt5Cpp.png (3.2 Кб, 31 просмотров)

Последний раз редактировалось 8Observer8; 26.11.2020 в 20:09.
8Observer8 вне форума Ответить с цитированием
Старый 27.11.2020, 11:34   #26
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,606
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
как же быстро летят года
И не говори )
Alar вне форума Ответить с цитированием
Старый 18.12.2020, 20:35   #27
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Вывод картинки (текстуры) на OpenGL 3.3 и Qt C++ с плавающем диапазоном координат по оси X

Выставляется система координат в центре клиентской области рисования. Диапазон по оси Y фиксированный и определяется константой WORLD_HEIGHT. Диапазон по оси X плавающий и зависит от соотношения сторон клиентской области окна. Определяется система координат ортографической матрицей проекции по следующему алгоритму:

Код:
    void resizeGL(int w, int h) override {
        glViewport(0, 0, w, h);
        float aspect = (float) w / h;
        float worldWidth = aspect * WORLD_HEIGHT;
        m_projMatrix.setToIdentity();
        m_projMatrix.ortho(-worldWidth / 2.f, worldWidth / 2.f,
                           -WORLD_HEIGHT / 2.f, WORLD_HEIGHT / 2.f, 50.f, -50.f);
    }
Метод resizeGL(int w, int h) вызывается автоматически: первый раз после создания окна, а последующие разы вызвается каждый раз при изменении размера окна.

Исходники: https://rextester.com/edit/BJW63108

TextureInOneFile_OpenGL33_Qt5Cpp_compressed.jpg

Код:
// Add this line to .pro:
// LIBS += -lopengl32

#ifdef _WIN32
#include <windows.h>
extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001;
#endif

#include <QtWidgets/QApplication>
#include <QtWidgets/QOpenGLWidget>
#include <QtGui/QOpenGLShaderProgram>
#include <QtGui/QOpenGLBuffer>
#include <QtGui/QOpenGLTexture>
#include <QtGui/QMatrix4x4>

class Widget : public QOpenGLWidget {
    Q_OBJECT
public:
    Widget() : m_texture(QOpenGLTexture::Target2D) {
        setWindowTitle("OpenGL 3.3. Qt C++");
        resize(400, 400);
    }
private:
    QOpenGLShaderProgram m_program;
    QOpenGLBuffer m_vertPosBuffer;
    QOpenGLBuffer m_texCoordBuffer;
    QOpenGLTexture m_texture;
    QMatrix4x4 m_mvpMatrix;
    QMatrix4x4 m_projMatrix;
    QMatrix4x4 m_viewMatrix;
    QMatrix4x4 m_modelMatrix;
    int m_uMvpMatrixLocation;
    const float WORLD_HEIGHT = 50;

    void initializeGL() override {
        glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
        resize(400, 400);
        const char *vertShaderSrc =
                "#version 330 core\n"
                "in vec3 aPosition;"
                "in vec2 aTexCoord;"
                "uniform mat4 uMvpMatrix;"
                "out vec2 vTexCoord;"
                "void main()"
                "{"
                "    gl_Position = uMvpMatrix * vec4(aPosition, 1.0);"
                "    vTexCoord = aTexCoord;"
                "}";
        const char *fragShaderSrc =
                "#version 330 core\n"
                "uniform sampler2D uSampler;"
                "in vec2 vTexCoord;"
                "out vec4 fragColor;"
                "void main()"
                "{"
                "    fragColor = texture2D(uSampler, vTexCoord);"
                "}";
        m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, vertShaderSrc);
        m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, fragShaderSrc);
        m_program.link();
        m_program.bind();
        float vertPositions[] = {
            -0.5f, -0.5f, 0.f,
            0.5f, -0.5f, 0.f,
            -0.5f, 0.5f, 0.f,
            0.5f, 0.5f, 0.f
        };
        float texCoords[] = {
            0.f, 1.f,
            1.f, 1.f,
            0.f, 0.f,
            1.f, 0.f
        };
        initVertexBuffer(m_vertPosBuffer, vertPositions, sizeof(vertPositions), "aPosition", 0, 3);
        initVertexBuffer(m_texCoordBuffer, texCoords, sizeof(texCoords), "aTexCoord", 1, 2);
        m_texture.create();
        m_texture.setData(QImage(":/Textures/WornBrownBrickwork_256.png"));
        m_texture.setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear);
        m_texture.setWrapMode(QOpenGLTexture::ClampToEdge);
        m_program.bind();
        m_uMvpMatrixLocation = m_program.uniformLocation("uMvpMatrix");
        m_modelMatrix.scale(QVector3D(50.f, 50.f, 1.f));
        m_viewMatrix.lookAt(QVector3D(0.f, 0.f, 40.f),
                            QVector3D(0.f, 0.f, 0.f),
                            QVector3D(0.f, 1.f, 0.f));
    }
    void paintGL() override {
        glClear(GL_COLOR_BUFFER_BIT);
        m_mvpMatrix = m_projMatrix * m_viewMatrix * m_modelMatrix;
        m_program.bind();
        m_program.setUniformValue(m_uMvpMatrixLocation, m_mvpMatrix);
        m_texture.bind();
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    }
    void resizeGL(int w, int h) override {
        glViewport(0, 0, w, h);
        float aspect = (float) w / h;
        float worldWidth = aspect * WORLD_HEIGHT;
        m_projMatrix.setToIdentity();
        m_projMatrix.ortho(-worldWidth / 2.f, worldWidth / 2.f,
                           -WORLD_HEIGHT / 2.f, WORLD_HEIGHT / 2.f, 50.f, -50.f);
    }
    void initVertexBuffer(QOpenGLBuffer &buffer, float data[], int amount,
                          const char *locationName, int locationIndex, int tupleSize) {
        buffer.create();
        buffer.bind();
        buffer.allocate(data, amount);
        m_program.bindAttributeLocation(locationName, locationIndex);
        m_program.setAttributeBuffer(locationIndex, GL_FLOAT, 0, tupleSize);
        m_program.enableAttributeArray(locationIndex);
    }
};

#include "main.moc"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
8Observer8 вне форума Ответить с цитированием
Старый 03.01.2021, 21:52   #28
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Такой же код, что и выше, но на PyQt5: https://rextester.com/LWYAU14361 Если нравится изучать Python, то сочетание PyQt5 + OpenGL + простые игры - это один из самых интересных путей изучения. Плюс можно писать неигровые приложения с интерактивной 3D (и/или 2D) графикой, сочетая с GUI на Qt. PyQt5 работает поверх Qt C++, поэтому работает довольно шустро.
Тот пример на OpenGL ES 2.0 и PyQt5, а ниже этот же пример переправленный под OpenGL 3.3 и ещё одна версия на PySide2:

PyQt5, OpenGL 3.3

main.py

Код:
import sys
import numpy as np
from OpenGL import GL as gl
from PyQt5.QtWidgets import QOpenGLWidget, QApplication
from PyQt5.QtGui import (QOpenGLBuffer, QOpenGLShaderProgram,
    QOpenGLShader)
from PyQt5.QtCore import Qt

class OpenGLWidget(QOpenGLWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Triangle, PyQt5, OpenGL 3.3")
        self.resize(400, 400)
    def initializeGL(self):
        gl.glClearColor(0.5, 0.8, 0.7, 1.0)
        vertShaderSrc = """
            #version 330 core
            in vec3 aPosition;
            void main()
            {
                gl_Position = vec4(aPosition, 1.0);
            }
        """
        fragShaderSrc = """
            #version 330 core
            void main()
            {
                gl_FragColor = vec4(0.5, 0.2, 0.9, 1.0);
            }
        """
        program = QOpenGLShaderProgram(self)
        program.addShaderFromSourceCode(QOpenGLShader.Vertex, vertShaderSrc)
        program.addShaderFromSourceCode(QOpenGLShader.Fragment, fragShaderSrc)
        program.link()
        program.bind()
        vertPositions = np.array([
            -0.5, -0.5, 0.0,
            0.5, -0.5, 0.0,
            0.0, 0.5, 0.0], dtype=np.float32)
        self.vertPosBuffer = QOpenGLBuffer()
        self.vertPosBuffer.create()
        self.vertPosBuffer.bind()
        self.vertPosBuffer.allocate(vertPositions, len(vertPositions) * 4)
        program.bindAttributeLocation("aPosition", 0)
        program.setAttributeBuffer(0, gl.GL_FLOAT, 0, 3)
        program.enableAttributeArray(0)

    def paintGL(self):
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)
        gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)

def main():
    QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
    a = QApplication(sys.argv)
    w = OpenGLWidget()
    w.show()
    sys.exit(a.exec_())

if __name__ == "__main__":
    main()
PySide2, OpenGL 3.3

main.py

Код:
import sys
import numpy as np
from OpenGL import GL as gl
from PySide2.QtWidgets import QOpenGLWidget, QApplication
from PySide2.QtGui import (QOpenGLBuffer, QOpenGLShaderProgram,
    QOpenGLShader)
from PySide2.QtCore import Qt

class OpenGLWidget(QOpenGLWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Triangle, PySide2, OpenGL 3.3")
        self.resize(400, 400)
    def initializeGL(self):
        gl.glClearColor(0.5, 0.8, 0.7, 1.0)
        vertShaderSrc = """
            #version 330 core
            in vec3 aPosition;
            void main()
            {
                gl_Position = vec4(aPosition, 1.0);
            }
        """
        fragShaderSrc = """
            #version 330 core
            void main()
            {
                gl_FragColor = vec4(0.5, 0.2, 0.9, 1.0);
            }
        """
        program = QOpenGLShaderProgram(self)
        program.addShaderFromSourceCode(QOpenGLShader.Vertex, vertShaderSrc)
        program.addShaderFromSourceCode(QOpenGLShader.Fragment, fragShaderSrc)
        program.link()
        program.bind()
        vertPositions = np.array([
            -0.5, -0.5, 0.0,
            0.5, -0.5, 0.0,
            0.0, 0.5, 0.0], dtype=np.float32)
        self.vertPosBuffer = QOpenGLBuffer()
        self.vertPosBuffer.create()
        self.vertPosBuffer.bind()
        self.vertPosBuffer.allocate(vertPositions, len(vertPositions) * 4)
        program.bindAttributeLocation("aPosition", 0)
        program.setAttributeBuffer(0, gl.GL_FLOAT, 0, 3)
        program.enableAttributeArray(0)

    def paintGL(self):
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)
        gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)

def main():
    QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
    a = QApplication(sys.argv)
    w = OpenGLWidget()
    w.show()
    sys.exit(a.exec_())

if __name__ == "__main__":
    main()
8Observer8 вне форума Ответить с цитированием
Старый 03.01.2021, 22:30   #29
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Тот же код, что и выше, но на JavaScript и WebGL 1.0: https://plnkr.co/edit/2OdAiD4VFPi9PZkn?preview

Только цвета другие:

dc57bcaf-036a-4591-ac86-04bacd02d5da.png

Код:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Triangle. WebGL 1.0, JavaScript</title>
</head>

<body>
    <canvas id="renderCanvas" width="300" height="300"></canvas>

    <script>
        const canvas = document.getElementById("renderCanvas");
        const gl = canvas.getContext("webgl");
        gl.clearColor(0.15, 0.15, 0.15, 1);

        const vertShaderSrc = [
            "attribute vec3 aPosition;",
            "void main()",
            "{",
            "    gl_Position = vec4(aPosition, 1.0);",
            "}"].join("\n");

        const fragShaderSrc = [
            "void main()",
            "{",
            "    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);",
            "}"].join("\n");

        const vShader = gl.createShader(gl.VERTEX_SHADER);
        gl.shaderSource(vShader, vertShaderSrc);
        gl.compileShader(vShader);
        const fShader = gl.createShader(gl.FRAGMENT_SHADER);
        gl.shaderSource(fShader, fragShaderSrc);
        gl.compileShader(fShader);
        const program = gl.createProgram();
        gl.attachShader(program, vShader);
        gl.attachShader(program, fShader);
        gl.linkProgram(program);
        gl.useProgram(program);

        const vertPositions = new Float32Array([
            -0.5, -0.5, 0,
            0.5, -0.5, 0,
            0, 0.5, 0
        ]);

        const vertPosBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, vertPosBuffer);
        gl.bufferData(gl.ARRAY_BUFFER, vertPositions, gl.STATIC_DRAW);
        gl.bindAttribLocation(program, 0, "aPosition");
        gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
        gl.enableVertexAttribArray(0);

        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.drawArrays(gl.TRIANGLES, 0, 3);
    </script>
</body>

</html>
8Observer8 вне форума Ответить с цитированием
Старый 01.11.2021, 15:27   #30
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Я два дня назад (30 октября - точка отсчёта) решил начать изучать игровой движок Godot. На главной страничке кликнул ссылку Learn, которая ведёт на вводные официальные пошаговые туториалы. Впервые впечатления у меня очень положительные. Язык GDScript очень сильно похож на Python. Движок поддерживает C# (и С++ вроде тоже, вместе с GDNative - не разбирался, что это). Мне нравится GDScript, потому что нравится Python. Потом попробую GDNative/C++ и может C#, но пока GDScript с головой хватит.

Сегодня я выполнил пошаговый туториал Your first game. Собрал результат выполнения туториала в Release для Window, Linux, MacOS и HTML5. Движение персонажа выполняется кликом мыши:
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уроки по созданию игр для новичков... -=DeS=- Gamedev - cоздание игр: Unity, OpenGL, DirectX 750 14.11.2017 20:26
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
Проблема с примером из темы "Уроки по созданию игр для новичков..." AvaMight Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 11.02.2012 10:55
Не могли бы дать заготовки процедур для базы данных romich.91 Паскаль, Turbo Pascal, PascalABC.NET 2 27.05.2009 18:00