批处理之家's Archiver

happy886rr 发表于 2017-6-5 22:04

CLGO3D解释器发布

[i=s] 本帖最后由 happy886rr 于 2017-6-6 08:37 编辑 [/i]

CLGO3D 绘图脚本语言,是CLGO平面绘图语言的3D版,目前处在测试阶段。将GDI+绘图库更换为OPENGL库,因此实现了三维线段绘制。
[quote]
下载外链图,存为a.zip,解压即是(含全部源码)。
[img]http://i1.piimg.com/1949/82fae80d04f65344.png[/img]

CLGO3D 1.0版
_____________________________________________________________________________
CLGO3D 绘图脚本语言,是CLGO平面绘图语言的3D版,目前是测试阶段。
_____________________________________________________________________________

W、A、S 键分别控制x、y、z轴视角。对.CL3后缀的文件直接拖拽到CLGO3D上运行。

_全局变量:[code]
-----------------------------------------------------------------------------
关键词(不区分大小写)        中文释义                    用法说明
-----------------------------------------------------------------------------
:PENX                       横坐标
:PENY                       纵坐标
:PENZ                       竖坐标
:PENY                       纵坐标
:PENW                       笔宽                        取值0-255
:PENC                       笔色                        取值0-15
:PENB                       笔背景色                    取值0-15
:PENS                       笔光滑度                    取值0-6
:PENA                       笔透明度                    取值0-255
:HEADING                    笔头角度                    取值0-360
:PEN0 - :PEN9               用户变量                    供用户使用的全局变量
[/code][/quote]代码太长(1911行)不再贴出。后续版本会继续改进语法,以便封装更多的GL函数进入脚本,从而实现复杂的三维绘图。
补充:从测试效果看OPENGL性能还是有瓶颈,后续版本可能换用DX绘图。

523066680 发表于 2017-6-5 22:53

[i=s] 本帖最后由 523066680 于 2017-6-5 23:00 编辑 [/i]

um ...

老刘1号 发表于 2017-6-5 23:07

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200128&ptid=44370]3#[/url] [i]523066680[/i] [/b]


    ……想说就说嘛

happy886rr 发表于 2017-6-6 08:38

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200127&ptid=44370]2#[/url] [i]老刘1号[/i] [/b]
彩色球
[img]http://i4.buimg.com/1949/2b345251c269c28b.png[/img][code]TO MORNING_GLORY :R :H
        FOR ::A -:R :R
                IF ::A%10=0
                        MAKE :PENC=RAND(15)+1 :PENZ=::A
                        MAKE :H=SQRT(:R^2-::A^2)
                        REPEAT 36
                                PU       
                                FD :H
                                PD
                                FD 10
                                BK :H+10
                                RT 10
                        ]
                ]
        ]

TO MAIN
        MAKE :PENW=6
        MORNING_GLORY 300 0
        WAIT[/code]

ivor 发表于 2017-6-6 08:48

期待更好的作品

happy886rr 发表于 2017-6-6 09:04

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200136&ptid=44370]6#[/url] [i]ivor[/i] [/b]
感谢支持

523066680 发表于 2017-6-6 09:43

[i=s] 本帖最后由 523066680 于 2017-6-6 09:48 编辑 [/i]

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=200130&ptid=44370]4#[/url] [i]老刘1号[/i] [/b]

如此单纯的示例,没有用到DrawArrayElements,没有用到CallList,
就能说是OPENGL性能瓶颈,未免有些太轻松了。

如果仅仅是截图中的绘制量,再加上 Anti-aliasing 和 Z-fighting Test 也不能体现出瓶颈。

要说瓶颈,那可能是接口调用造成的消耗。

我并没有偏袒 OpenGL 的意思,而是觉得这句话说的太轻松了。

happy886rr 发表于 2017-6-6 09:49

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200141&ptid=44370]8#[/url] [i]523066680[/i] [/b]
一般的图还行,只是我在测试用opengl画分形时,递归量太大,直接卡住。

523066680 发表于 2017-6-6 09:54

[i=s] 本帖最后由 523066680 于 2017-6-6 09:57 编辑 [/i]

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=200142&ptid=44370]9#[/url] [i]happy886rr[/i] [/b]


    那是因为没有用 Shader,
DX提供类似的机制,把计算交给GPU而不是CPU。

happy886rr 发表于 2017-6-6 10:03

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200143&ptid=44370]10#[/url] [i]523066680[/i] [/b]
我发现opengl就是为脚本而生的,glbegin 画点东西,glend结束。然后继续这样画,所以就很容易封装为脚本,从而脱离C语言。

523066680 发表于 2017-6-6 11:00

[i=s] 本帖最后由 523066680 于 2017-6-6 11:22 编辑 [/i]

这个机制是降低了门槛,但是新的GL很快淘汰了所有 begin 和 end 系列的函数,是因为性能瓶颈的缘故。
有大量的图像优化、像素操作可以交给 GPU。
特别是像Julia 集合图像,程序这边只需要给出画布范围大小,比如 800 * 600
把公式交给 GPU,GPU着色器在渲染图形的每一个像素点时候,通过你给定的公式计算该点的颜色值。

[img]http://imgout.ph.126.net/56020013/3.jpg[/img]

原图是 800x600 的(拉至全屏也不影响渲染效率,工作电脑的显卡是 GT430)

性能和易用性、自由度,往往很难兼得。

简单的脚本绘图可以脱离C语言,但是到了Shader层次,仍然是在 C/C++ 的语法上进行扩充

片元着色器/代码来自蓝皮书[code]// Julia set renderer - Fragment Shader
// Graham Sellers
// OpenGL SuperBible

#version 150 core
in vec2 initial_z;
out vec4 color;
uniform sampler1D tex_gradient;
uniform vec2 C;

void main(void)
{
    vec2 Z = initial_z;
    int iterations = 0;
    float rate;
    const float threshold_squared = 16.0;
    const int max_iterations = 256;
    while (iterations < max_iterations && dot(Z, Z) < threshold_squared)
    {
        vec2 Z_squared;
        Z_squared.x = Z.x * Z.x - Z.y * Z.y + C.y;
        Z_squared.y = Z.x * Z.y * 2.0 + C.x;
        Z = Z_squared;
        iterations++;
    }
   
    if (iterations == max_iterations)
        color = vec4(0.0, 0.0, 0.0, 1.0);
    else
        rate =  float(iterations) / 10.0;
        color = vec4( sin(rate), cos(1.0-rate), exp(rate), 1.0);
}[/code]

523066680 发表于 2017-6-6 11:51

[i=s] 本帖最后由 523066680 于 2017-6-6 12:04 编辑 [/i]

我只能推荐两本书:
OpenGL Superbible 7th

OpenGL Programming Guide 8th
书的官方网站有示例代码,可以 cmake 编译。

讲真,学习成本挺高的,特别是业余学,耗时。DirectX 学习成本也不低,DX11 和 DX12 的英文教学拳头这么厚。
Introduction to 3D Game Programming: With Directx 11
Introduction to 3D Game Programming: With Directx 12

所以当楼主说 OGL有瓶颈,换DX 的时候我特别激动,这根本不是件轻松的事情,
当真的了解整个框架,把能优化的技巧都用上了,遇到的瓶颈才算是瓶颈。

happy886rr 发表于 2017-6-6 12:23

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200148&ptid=44370]13#[/url] [i]523066680[/i] [/b]
好资料,我没显卡,用的是cpu核显测试的,所以感觉太卡了。

3518228042 发表于 2017-6-8 13:02

256色色相环怎么写?每层16色,共16层环形

happy886rr 发表于 2017-6-8 23:37

[i=s] 本帖最后由 happy886rr 于 2017-6-8 23:45 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200201&ptid=44370]17#[/url] [i]3518228042[/i] [/b]

你画个图出来,我看看是啥样。
莫非是要这种效果?
[img]http://s10.sinaimg.cn/bmiddle/a2fb2cf8tbae3f7d20a59&690[/img]
(本图仅为外链)

3518228042 发表于 2017-6-9 15:54

[img]https://p1.ssl.qhmsg.com/dr/220__/t016fd7510ae986334c.jpg[/img]
看了下,这样的,红蓝绿各256色,分成24份,然后32环,可以放大,方便取色器在上取色,16x16的塞不下

happy886rr 发表于 2017-6-9 18:13

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200240&ptid=44370]19#[/url] [i]3518228042[/i] [/b]
哦,你可以直接用photoshop做啊,那个做的颜色比较准。

bailong360 发表于 2017-6-16 12:16

原创开源区已被lz占领[img]http://www.bathome.net/images/smilies/default/lol.gif[/img]

老刘1号 发表于 2017-6-16 12:46

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200406&ptid=44370]21#[/url] [i]bailong360[/i] [/b]


    向2屏进发中;P

happy886rr 发表于 2017-6-16 22:41

[i=s] 本帖最后由 happy886rr 于 2017-6-16 22:50 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200406&ptid=44370]21#[/url] [i]bailong360[/i] [/b]
:lol 用着很多github的开源工具, 写的东西不开源,不像github的风格。
capix最后的汇编可以整合为一个[code]double callAPI(void *hProc, int *arr, int len, int callMODE, BOOL retMODE)
{
        int    retINT;
        double retLLF;

        __asm
        {
                mov ebx, dword ptr [arr]  ;//把arr指向的地址(参数列表的尾地址)放入ebx
                mov ecx, dword ptr [len]  ;//把len的值放入ecx,作为循环控制变量
                dec ecx                          ;//递减ecx

        LOOP1:
                mov eax, dword ptr [ebx]  ;//倒序把数组arr(ebx指向的内容)的内容加载到eax
                sub ebx, 4                ;//把ebx的内容递减4(ebx指向的前移一位)
                push eax                  ;//把eax压栈
                dec ecx                          ;//递减ecx

                jns LOOP1                  ;//如果ecx不为负值,则跳转到LOOP1:

                call dword ptr [hProc]    ;//调用API
                fstp retLLF;
                mov retINT, eax           ;//返回值存入result

                mov ebx, dword ptr [len]  ;//把len的值放入ebx
                SHL ebx, 2                ;//左移两位,这是可变参数的大小
                cmp callMODE, 0
                je  LOOP2
                add esp, ebx
        LOOP2:
                xor eax, eax              ;//清空eax
        }
        return (retMODE)?retINT:retLLF;
}[/code]

bailong360 发表于 2017-6-17 09:03

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200430&ptid=44370]23#[/url] [i]happy886rr[/i] [/b]
学习了

我只是惊讶于LZ的高产[img]http://www.bathome.net/images/smilies/default/lol.gif[/img]

happy886rr 发表于 2017-6-17 11:43

[i=s] 本帖最后由 happy886rr 于 2017-6-17 11:46 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200435&ptid=44370]24#[/url] [i]bailong360[/i] [/b]
我的速度并不快。因为写完要进行黑白盒测试,还要修bug,精简代码逻辑,优化速度,完善注释,写使用说明。规范化的开发流程使得你: 不可能像其他开发者那样轻松。
对不同语言的win系统,做TCHAR兼容,对不同编译器、乃至不同操作系统做编译器兼容。对用户的各类错误输入,程序的错误运行都要做错误反馈输出。

最终呈现在用户面前的应该是极佳的、高质量的第三方应用。呈现在读者面前的应该是规范的、思维严密、逻辑清晰的代码。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.