(非常详细的问题报告 - tl;底部是博士!)
我真的更喜欢GLFW到Glut,并希望它的Golang绑定在Windows 64位下使用Go 1.0.1 64位.在Linux下,它的绑定完美无瑕.这在原则上是在Windows下是可行的- GitHub的用户家校会设法来做到这一点,但他是在Win32和他的提示没有解决我的问题呢.但是我确实有一个基于tdm64-gcc-4.6.1的完整而干净的Mingw64设置.
Now here's the strange thing -- getting the freeglut binding to work under 64-bit Windows, 64-bit Go 1.0.1 works -- the glfw binding fails for me. I want to figure out why, as they essentially both use the same cgo features and techniques.
Note I currently have a self-made half-baked but essentially working replacement package in place that uses LoadLibrary/GetProcAddress calls to expose glfw.dll in …
在我的初学者看来,人们可以实现Data.List.null
:
null [] = True
null _ = False
Run Code Online (Sandbox Code Playgroud)
查看Hackage中的实际来源,我看到:
null = foldr (\_ _ -> False) True
Run Code Online (Sandbox Code Playgroud)
我发现这很好奇,当然我错过了一些我应该学习的东西,但是什么呢?
在Data.Map.Lazy
和之间进行选择时Data.Map.Strict
,文档会告诉我们前者:
该模块的API在键中是严格的,但在值中是懒惰的.如果您需要价值严格的地图,请
Data.Map.Strict
改用.
对于后者同样如下:
该模块的API在键和值中都是严格的.如果您需要价值懒惰的地图,请
Data.Map.Lazy
改用.
经验丰富的Haskellers比我更倾向于直觉这个"需要"吗?用例 - 运行 - 完成(即不是守护程序/长期运行)命令行工具:基于readFile
简单lines
的自定义配置文件,其中许多(不是全部)行定义键:值对被收集到一个Map
.完成后,我们会根据之后读取的其他值重写其中的许多值(由于不变性,在此过程中我们创建一个新的Map
并丢弃初始化身).
(虽然在实践中这个文件可能不会经常或甚至达不到1000行,但我们只是假设为了学习某些用户不久就会这样做.)
任何给定的工具运行可能会查找大约20-100%的(重载加载,虽然懒惰eval我永远不会确定" 当真的 ")键:值对,在一次到几十次之间的任何地方.
我如何推断"价值严格"和"价值懒惰"之间的区别Data.Map
?如果你愿意的话,在主流计算方面会发生什么?
从根本上说,这种哈希映射当然是关于"存储一次,多次查找"---然而,计算中的内容并非"从根本上".此外,lazy-eval的整个概念似乎归结为这个原则,为什么不总是保持价值懒惰呢?
我正在使用这个工具,用户可以在[config files |中定义 - 并包含它 内容文本文件| 他们自己的"模板"(如胡子等),这些可以引用其他人,以便他们可以诱导循环.正当我即将创建一个"max-loops"设置时,我意识到runghc程序一段时间之后只是退出了告别消息<<loop>>
.这对我来说实际上已经足够好了但引起了一些思考:
GHC或运行时如何实际检测到它被卡在循环中,它如何区分所需的长时间运行操作和偶然的无限循环?暂停问题仍然是我检查的最后一个问题..
任何(时间或迭代)限制可以自定义设置到编译器或运行时?
是runghc
- 或者它是否存在于所有最终编译输出中?
-o
当构建版本禁用这个明显的内置循环检测时,是否会设置任何(优化)标志?
所有的东西,我当然可以找出困难的方法,但谁知道也许有人已经更详细地研究了这个...(很难google/ddg "haskell" "<<loop>>"
因为他们剥离尖括号然后显示"如何在Haskell中循环"的结果"等......)
离屏渲染到纹理绑定的屏幕外帧缓冲对象应该是如此微不足道,但我遇到了一个问题,我无法绕过头脑.
我的完整示例程序(目前只有2D!)在这里:
请参阅下面的一些说明.
我正在创建一个rgba纹理对象512x512,将其绑定到FBO.此时不需要深度或其他渲染缓冲区,严格来说是2D.
以下非常简单的着色器渲染到此纹理:
顶点着色器:
varying vec2 vPos; attribute vec2 aPos;
void main (void) {
vPos = (aPos + 1) / 2;
gl_Position = vec4(aPos, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
在aPos中,这只是一个包含4 xy坐标的VBO,用于四边形(-1,-1 :: 1,-1 :: 1,1:-1,1)
因此,虽然帧缓冲分辨率理论上应该是512x512,但着色器将其"纹理"渲染到"全(关)屏幕四边形"上,遵循GLs -1..1 coords范例.
片段着色器:
varying vec2 vPos;
void main (void) {
gl_FragColor = vec4(0.25, vPos, 1);
}
Run Code Online (Sandbox Code Playgroud)
所以它设置了一个完全不透明的颜色,红色固定为0.25,绿色/蓝色取决于x/y,介于0和1之间.
在这一点上,我的假设是渲染512x512纹理,仅显示-1..1全(关)屏幕四边形,片段阴影显示绿色/蓝色从0..1.
所以这是我的屏幕外设置.在屏幕上,我有另一个真正可见的全屏四边形与4 xyz坐标{-1,-1,1 ::: 1,-1,1 ::: 1,1,1 ::: -1,1, 1}.同样,现在这是2D所以没有矩阵,所以z总是1.
此四边形由不同的着色器绘制,只需渲染给定的纹理,即教科书GL-101样式.在我上面链接的示例程序中,我有一个简单的布尔切换doRtt,当这是假(默认)时,根本不执行渲染到纹理,这个着色器只显示使用当前目录中的texture.jpg.
这个doRtt = false模式显示第二个屏幕四重渲染器对于我当前的要求是"正确的"并按照我的要求执行纹理化:垂直重复两次和水平重复两次(稍后将被钳制,重复仅用于测试这里),否则使用NO纹理过滤或mipmapping进行缩放.
因此,无论窗口(以及视图端口)如何调整大小,我们总是会看到一个全屏四边形,其中单个纹理水平重复两次,垂直重复两次.
现在,使用doRtt = true,第二个着色器仍然可以完成它的工作,但纹理永远不会完全正确缩放 - 或绘制,我不确定,因为不幸的是我们不能只说"嘿gl将此FBO保存到磁盘调试目的".
RTT着色器执行一些部分渲染(或者可能是一个完整的渲染,再次无法确定屏幕外发生了什么......)特别是当您调整视口大小比默认大小小很多时,您会看到纹理之间的间隔重复,并非确实显示了我们非常简单的RTT片段着色器所期望的所有颜色.
(A)要么:512x512纹理是正确创建的,但我的代码没有正确映射(但是为什么doRtt = false任何给定的texture.jpg文件使用完全相同的简单纹理四边形着色器显示得很好?)
(B)或:512x512纹理没有正确渲染,不知何故rtt frag着色器根据窗口分辨率改变其输出 …
我有一些3D代码,我注意到它不会在严格的核心配置文件中呈现,但在"正常"(未明确请求为核心)配置文件上下文中很好.为了找出问题,我编写了最简单的最简单的OpenGL程序,只绘制了一个三角形和一个矩形:
我在这里发布了OpenGL程序作为Gist.
将useStrictCoreProfile变量设置为false,程序不会向控制台输出错误消息,并根据上面的屏幕截图绘制四边形和三角形,包括Intel HD OpenGL 3.3和带OpenGL 4.2的GeForce.
但是,将useStrictCoreProfile设置为true,它会清除背景颜色但不会绘制tri和quad,控制台输出是这样的:
GLCONN: OpenGL 3.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 (GLSL: 1.50 NVIDIA via Cg compiler)
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step '(post loop)': GL_INVALID_OPERATION
EXIT
Run Code Online (Sandbox Code Playgroud)
...如果要求4.2严格的核心配置文件而不是3.2,则同样的问题.适用于3种不同的nvidia GPU,因此我假设我没有正确地符合严格的核心配置文件.我做错了什么,我该如何解决这个问题?
注意,你不会在上面的Gist中找到glEnableVertexAttribArray调用,因为它在我正在导入的glutil包中 - 但这确实被称为gist的compileShaders()函数中的最后一步.
当我阅读Haskell历史中的一些章节时,我遇到了:
但是,更高级别的多态性具有独立的效用:声明在更高种类上参数化的数据类型是完全可能的,有时非常有用,例如:
data ListFunctor f a = Nil | Cons a (f a)
Run Code Online (Sandbox Code Playgroud)
知道"基本"ADT我在这里有点困惑,我的"猜测"是parens中的部分表示"参数"/"动态" 一元数据构造函数 f
?所以任何* -> *
"可以接受"类型的数据构造函数a
?我的想法是正确的还是我误解了语法?我知道我"只是在猜测",但我希望在这里能够获得一个关于这种能力的"平面程序员"直觉,一些需要(或从中受益匪浅)的示例场景;)大多数我可以想象(只是没有在什么精确的方式)这使得那些"小型嵌入式多功能可递送配置语言"-ADTs更加灵活,Haskell很高兴能够evals
为... 编写和编写?
在GHCi中,:i ListFunctor
基于以上给出:
type role ListFunctor representational nominal
data ListFunctor (f :: * -> *) a = Nil | Cons a (f a)
Run Code Online (Sandbox Code Playgroud)
所以这似乎是从更加清晰的data
宣言中"推断出来的" .
试图至少使用Lighthouse3D Radar Frustum Culling教程的非常简单的 第1部分来工作......我绝对感到困惑,我甚至无法在我的渲染器中使用该部分.
所以第一步是:你测试一个点是在近平面前面还是在远平面后面,如果是这样的话就进行早期剔除.(如果没有,那么你会进行进一步的测试,但我只是坚持第一部分.)
我使用2x2立方体的世界空间中心(x1y2z3),并有一个可以自由移动和旋转的相机.所有我的矢量和矩阵的东西必须相当坚固,因为渲染器否则工作得很好.所以这是我对第一部分的看法(在Go中),简单的"Z vs near-or-far"测试:
func (cam *Camera) frustumHasPoint(point *Vec3) bool {
var pc Vec3
v := point.Sub(&cam.Controller.Pos) // point minus camPos
ref := cam.Controller.dir // take a copy of camDir
ref.Z = -ref.Z
ref.Normalize() // camDir was already normalized but anyway...
pc.Z = v.Dot(&ref)
if pc.Z > cam.Perspective.ZFar || pc.Z < cam.Perspective.ZNear {
return false
}
return true
}
Run Code Online (Sandbox Code Playgroud)
现在我为什么要反转ref的Z?因为在教程中他们写道:"请注意,图中的参考不是右手系统(如在OpenGL中),因为Z的方向已被颠倒以使教程更直观" - 好吧,在GL教程中当然这有相反的效果......
好吧,如果如上所述反转Z,它会剔除超过50%的时间; 如果我不这样做,那么大约98%的时间它会"过度剔除".
我错过了什么?
有点烦人的是,我不断收到此警告(对于某些 20 个左右的模块,会污染构建输出,否则我会在不滚动的情况下看到诸如实际的 ghc 警告等):
“以下模块应添加到proj-name
.cabal 中的暴露模块或其他模块
和:
stack new proj-name simple
)项目,.cabal
设置为仅包含一个executable proj-name
(no library
),stack new ..
复制src
文件/子目录之后。这里假设的工作流程是什么,我是否认真地手动保持这些模块列表.cabal
与我的模块文件同步?
在此线程中,有人建议“现代答案是 Stack(和 hpack)”,但我真的希望单独使用 stack 就足够了,或者可以设置为。如果我要为构建设置另一个(堆栈之后的第三个,因此隐式 cabal)工具,不妨回去构建调用 ghc 的脚本。
所以问题是:整体非常灵活、强大和强大的堆栈如何也能帮助克服这种阴谋集团的可憎之物?=)
Golang的math.Mod(10,4)返回2 - 即.除法结果2.5的整数部分 - 但不应该是"浮点余数",即0.5?