見出し画像

生成AIとのひつまぶし(8)

生成AIとの暇つぶし(雑談)です。

今回は、しがないSE的な実験を試してみました。しがないSEの能力の限界で、専門用語や生成テキスト、生成コードをそのまま利用し、記載していますのでご了承ください。😌


私>ChatGTPとのコミュニケーションを、一連のシーケンスとみなしたとき、通常は、トリガーとしてリクエストしてからレスポンスが返されますが、実験として、挨拶のみのリクエストをトリガーとし、レスポンスに実質的なリクエストを返し、そのリクエストの答えを、次のリクエストで返す様な対話を行う事ができますか?

ChatGPT>はい、もちろん可能です。では実験を始めましょう。まずは挨拶をお願いします。それに対して、次に行うリクエストをレスポンスとして返します。その次のメッセージでそのリクエストに対する答えを提供する形に進めます。どうぞ、お始めください。


私>こんばんは。

ChatGTP>こんばんは!次のメッセージで、プログラミングの学習に関して何か質問をしてください。それに対する回答を次のレスポンスとして提供します。

私>なるほど、そう来ましたか。現在、私は、趣味で3DCGプログラミングを行ってますが、次に取り組む題材に迷ってます。

ChatGPT>次のメッセージで、3DCGプログラミングの題材として「リアルタイムレイトレーシング」を検討してみてはいかがでしょうか。どのように始めるか、基本的な情報とステップをお伝えします。

私>レイトレーシングについては、3DCGの写実性を高める技術である事は理解しています。私の好みは動く3DCGプログラミングですが、残念ながら、リアルタイムのレイトレーシングを行える性能のあるコンピュータを用意する事が現実的ではありません。

ChatGPT>そうでしたか。では、次のメッセージで「動く3DCGプログラミング」でお勧めできる題材として、「シェーダープログラミング」を提案します。基本的なシェーダーの作成方法や、使用するツールについての情報をお伝えします。

私>提案してくれているシェーダープログラミングとは、具体的にどの様な特徴がありますか?

ChatGPT>シェーダープログラミングは、3DCGの見た目や動作を制御するためのプログラミング技術です。シェーダーは主に次のような特徴があります:

  1. リアルタイム性:リアルタイムでオブジェクトの表面の色、反射、透明度などを変更できます。

  2. 柔軟性:光の当たり方や物体の質感を詳細に設定できるため、独自の視覚効果を作成可能です。

  3. パフォーマンス向上:GPUで実行されるため、計算負荷をCPUから分散させることができます。

次のメッセージで、基本的なシェーダーの作成方法や、使用するツール(例:UnityやUnreal Engineなど)について説明します。

私>現在の私のプラットフォームはMacOSで、プログラミング言語には、Swiftを利用しています。この環境でも、説明してもらえますか?

ChatGPT>もちろんです。MacOSとSwiftを利用したシェーダープログラミングについて説明します。

Swiftでのシェーダープログラミング

SwiftとMacOSを使用する場合、Metalを活用するのが最適です。MetalはAppleが提供する低レベルのグラフィックスAPIで、高性能なグラフィックスとコンピューティングを実現します。

基本的な手順

1.Metalのセットアップ
・Xcodeで新しいプロジェクトを作成し、Metalアプリケーションのテンプレートを選びます。
・プロジェクトの設定でMetalを有効にします。

2.シェーダーファイルの作成
・新しい.metalファイルを作成し、頂点シェーダーとフラグメントシェーダーを定義します。

// MyShader.metal
#include <metal_stdlib>
using namespace metal;

// 頂点シェーダー
vertex float4 vertex_main(const device packed_float3* vertex_array [[ buffer(0) ]],
                          unsigned int vid [[ vertex_id ]]) {
    return float4(vertex_array[vid], 1.0);
}

// フラグメントシェーダー
fragment float4 fragment_main() {
    return float4(1.0, 0.0, 0.0, 1.0); // 赤色で描画
}

3.SwiftでMetalを使う
・シェーダーをコンパイルし、Metalデバイス、コマンドキュー、レンダーパイプラインなどを設定します。

import MetalKit

class Renderer: NSObject, MTKViewDelegate {
    var device: MTLDevice!
    var pipelineState: MTLRenderPipelineState!
    var commandQueue: MTLCommandQueue!
    var vertices: MTLBuffer!

    init(mtkView: MTKView) {
        super.init()
        self.device = MTLCreateSystemDefaultDevice()
        mtkView.device = device
        mtkView.delegate = self

        let vertexData: [Float] = [
            -1.0, -1.0, 0.0,
             1.0, -1.0, 0.0,
            -1.0,  1.0, 0.0,
             1.0,  1.0, 0.0
        ]

        vertices = device.makeBuffer(bytes: vertexData, length: vertexData.count * MemoryLayout<Float>.size, options: [])

        let library = device.makeDefaultLibrary()
        let vertexFunction = library?.makeFunction(name: "vertex_main")
        let fragmentFunction = library?.makeFunction(name: "fragment_main")

        let pipelineDescriptor = MTLRenderPipelineDescriptor()
        pipelineDescriptor.vertexFunction = vertexFunction
        pipelineDescriptor.fragmentFunction = fragmentFunction
        pipelineDescriptor.colorAttachments[0].pixelFormat = mtkView.colorPixelFormat

        pipelineState = try! device.makeRenderPipelineState(descriptor: pipelineDescriptor)
        commandQueue = device.makeCommandQueue()
    }

    func draw(in view: MTKView) {
        guard let drawable = view.currentDrawable,
              let renderPassDescriptor = view.currentRenderPassDescriptor else { return }

        let commandBuffer = commandQueue.makeCommandBuffer()!
        let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)!

        renderEncoder.setRenderPipelineState(pipelineState)
        renderEncoder.setVertexBuffer(vertices, offset: 0, index: 0)
        renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4)
        renderEncoder.endEncoding()

        commandBuffer.present(drawable)
        commandBuffer.commit()
    }
}

4.ビューの設定
・MTKViewを使用して、Metalの描画を行うビューを設定します。

import Cocoa
import MetalKit

class ViewController: NSViewController {
    var mtkView: MTKView!
    var renderer: Renderer!

    override func viewDidLoad() {
        super.viewDidLoad()

        mtkView = MTKView(frame: view.bounds, device: MTLCreateSystemDefaultDevice())
        view.addSubview(mtkView)

        renderer = Renderer(mtkView: mtkView)
    }
}

以上が基本的な手順です。Metalを使用することで、高性能なシェーダープログラミングが可能になります。これをベースに、さまざまなエフェクトや動きのある3DCGを作成してみてください。

私>ありがとう。試してみます。😆

ChatGPT>どういたしまして!頑張ってくださいね。何か質問があればいつでも聞いてください。楽しんで3DCGプログラミングを進めてください!😆


感想

 今回の実験では、擬似的ですが、生成AIからのリクエスト、私からのレスポンスといった流れでの『逆転会話』を試み、概ね、そのような会話形式が実現できることを確認できました。😅
 ただし、生成AIから「次のメッセージで…してください」のようにレスポンスを誘導しているとこあたりが、大いに不自然でした。😖
 この『逆転会話』については、もう少し自然な会話と、生成AIから持ちかけられる話題を有意義な話題へ切り替える実験へと繋げてみたいと思います。

この記事が気に入ったらサポートをしてみませんか?