小编met*_*eap的帖子

通过Windows cgo-> gcc-> ld进行DLL链接会产生"undefined-reference-to-(function)"错误

(非常详细的问题报告 - 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 …

gcc mingw go glfw cgo

23
推荐指数
2
解决办法
4327
查看次数

为什么'Data.List.null'使用'foldr'?

在我的初学者看来,人们可以实现Data.List.null:

null [] = True
null _ = False
Run Code Online (Sandbox Code Playgroud)

查看Hackage中的实际来源,我看到:

null = foldr (\_ _ -> False) True
Run Code Online (Sandbox Code Playgroud)

我发现这很好奇,当然我错过了一些我应该学习的东西,但是什么呢?

haskell

8
推荐指数
1
解决办法
196
查看次数

Data.Map:如何判断我是否"需要价值严格的地图"?

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的整个概念似乎归结为这个原则,为什么不总是保持价值懒惰呢?

haskell

8
推荐指数
1
解决办法
318
查看次数

<< loop >>错误如何"正常"工作?

我正在使用这个工具,用户可以在[config files |中定义 - 并包含它 内容文本文件| 他们自己的"模板"(如胡子等),这些可以引用其他人,以便他们可以诱导循环.正当我即将创建一个"max-loops"设置时,我意识到runghc程序一段时间之后只是退出了告别消息<<loop>>.这对我来说实际上已经足够好了但引起了一些思考:

  • GHC或运行时如何实际检测到它被卡在循环中,它如何区分所需的长时间运行操作和偶然的无限循环?暂停问题仍然是我检查的最后一个问题..

  • 任何(时间或迭代)限制可以自定义设置到编译器或运行时?

  • runghc- 或者它是否存在于所有最终编译输出中?

  • -o当构建版本禁用这个明显的内置循环检测时,是否会设置任何(优化)标志?

所有的东西,我当然可以找出困难的方法,但谁知道也许有人已经更详细地研究了这个...(很难google/ddg "haskell" "<<loop>>"因为他们剥离尖括号然后显示"如何在Haskell中循环"的结果"等......)

haskell ghc

8
推荐指数
1
解决办法
218
查看次数

OpenGL渲染到纹理 - 通过FBO - 与正常纹理不正确显示

离屏渲染到纹理绑定的屏幕外帧缓冲对象应该是如此微不足道,但我遇到了一个问题,我无法绕过头脑.

我的完整示例程序(目前只有2D!)在这里:

http://pastebin.com/hSvXzhJT

请参阅下面的一些说明.

我正在创建一个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着色器根据窗口分辨率改变其输出 …

opengl framebuffer off-screen go render-to-texture

7
推荐指数
1
解决办法
2279
查看次数

如何使这个简单的OpenGL代码(在"宽松"3.3和4.2配置文件中工作)在严格的3.2和4.2核心配置文件中工作?

我有一些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()函数中的最后一步.

opengl go opengl-3 opengl-4 vertex-attributes

7
推荐指数
1
解决办法
1628
查看次数

什么类型的问题有助于"更高通道的多态性"更好地解决?

当我阅读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宣言中"推断出来的" .

polymorphism haskell higher-kinded-types

7
推荐指数
1
解决办法
366
查看次数

Frustum Culling的"雷达方法":首次简单测试失败?

试图至少使用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%的时间它会"过度剔除".

我错过了什么?

opengl frustum rendering-engine go culling

6
推荐指数
1
解决办法
709
查看次数

如何在 *.cabal 中自动填充“exposed-modules or other-modules”

有点烦人的是,我不断收到此警告(对于某些 20 个左右的模块,会污染构建输出,否则我会在不滚动的情况下看到诸如实际的 ghc 警告等):

“以下模块应添加到proj-name.cabal 中的暴露模块或其他模块

和:

  • 一个新创建的(通过stack new proj-name simple)项目,
  • .cabal设置为仅包含一个executable proj-name(no library),
  • 然后我在从非堆栈/cabal 项目stack new ..复制src文件/子目录之后。

这里假设的工作流程是什么,我是否认真地手动保持这些模块列表.cabal与我的模块文件同步?

此线程中,有人建议“现代答案是 Stack(和 hpack)”,但我真的希望单独使用 stack 就足够了,或者可以设置为。如果我要为构建设置另一个(堆栈之后的第三个,因此隐式 cabal)工具,不妨回去构建调用 ghc 的脚本。

所以问题是:整体非常灵活、强大和强大的堆栈如何也能帮助克服这种阴谋集团的可憎之物?=)

cabal haskell-stack

6
推荐指数
0
解决办法
1863
查看次数

math.Mod in Go返回整数部分而不是浮点数余数

Golang的math.Mod(10,4)返回2 - 即.除法结果2.5的整数部分 - 但不应该是"浮点余数",即0.5?

floating-point division go modulo

5
推荐指数
1
解决办法
1万
查看次数