我一直在移植Sebastiano Vigna的xorshift1024* PRNG以兼容标准的C++ 11统一随机数生成器合同,并注意到jump()他提供的功能有一些奇怪的行为.
根据Vigna的说法,呼叫jump()应该相当于2 ^ 512次呼叫next().因此,一系列的调用jump()和next()应该是可交换的.例如,假设发电机以某种已知状态启动,
jump();
next();
Run Code Online (Sandbox Code Playgroud)
应该让发电机处于相同的状态
next();
jump();
Run Code Online (Sandbox Code Playgroud)
因为两者都应该相当于
for (bigint i = 0; i < (bigint(1) << 512) + 1; ++i)
next();
Run Code Online (Sandbox Code Playgroud)
假设bigint是一些具有极大最大值的整数类型(假设你是一个非常非常非常有耐心的人).
不幸的是,这不适用于Vigna提供的参考实现(我将在最后包括后代;如果上面链接的实现发生变化或将来被删除).使用以下测试代码测试前两个选项时:
memset(s, 0xFF, sizeof(s));
p = 0;
// jump() and/or next() calls...
std::cout << p << ';';
for (int i = 0; i < 16; ++i)
std::cout << ' ' << s[i];
Run Code Online (Sandbox Code Playgroud)
jump()在next()输出之前调用:
1; 9726214034378009495 13187905351877324975 …Run Code Online (Sandbox Code Playgroud) 我正在尝试为Visual Studio 2013(专业版)C++项目制作一些简单的项目模板,但Visual Studio似乎正在和我一起战斗.我开始使用File -> Export Template...向导,它完成并生成了一个zip文件,但是唉,新模板在Add New Item对话框中无处可见,所以我开始手动编辑它以查看是否可以修复它.
这是我的测试.vstemplate文件:
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Item">
<TemplateData>
<DefaultName>test</DefaultName>
<Name>Test</Name>
<Description>Test item template.</Description>
<ProjectType>VC</ProjectType>
<!--<SortOrder>10</SortOrder>-->
<Icon>icon.ico</Icon>
</TemplateData>
<TemplateContent>
<ProjectItem TargetFileName="$fileinputname$.h" ReplaceParameters="true">test.h</ProjectItem>
</TemplateContent>
</VSTemplate>
Run Code Online (Sandbox Code Playgroud)
我同时使用尝试VC和VisualC对<ProjectType>置模板在不同的文件夹,在这两个压缩和扩展形式.
改变后<ProjectType>到CSharp,创造了C#项目它会立即显示出来.有趣的是,如果该%USERPROFILE%\Documents\Visual Studio 2013\Templates\ItemTemplates\Visual C#目录是空的,模板现在将显示如果是在%USERPROFILE%\Documents\Visual Studio 2013\Templates\ItemTemplates或%USERPROFILE%\Documents\Visual Studio 2013\Templates\ItemTemplates\Visual C++ Project目录,但如果它的一个副本,也是在Visual C#目录它新项目的对话框两次显示出来...
我知道Visual Studio 2013 Express RC存在一个错误,其中New Item对话框根本不会显示任何模板,甚至是内置的模板,所以我认为这可能是Visual Studio中的一个错误,或者只是另一个微软令人不安的无视C++的例子.
有没有我在这里缺少的东西,或者这是VS2013的错误?若有,那么有谁知道任何解决方法?
编辑:此问题仍存在于Visual Studio 2015 RC中
c++ visual-studio visual-c++ visual-studio-2013 visual-studio-2015
我正在编写一个批处理系统,它跟踪当前绑定的纹理以避免不必要的glBindTexture()调用。我不确定是否需要跟踪特定批次已经使用了哪些纹理,以便如果纹理被使用两次,它将被绑定到需要它的第二个采样器的不同 TIU。
OpenGL 应用程序在同一着色器阶段为多个采样器使用相同的纹理图像单元是否可以接受?不同着色器阶段的采样器怎么样?例如:
片段着色器:
...
uniform sampler2D samp1;
uniform sampler2D samp2;
void main() { ... }
Run Code Online (Sandbox Code Playgroud)
主程序:
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id);
glUniform1i(samp1_location, 0);
glUniform1i(samp2_location, 0);
...
Run Code Online (Sandbox Code Playgroud)
我看不出有任何原因为什么这不应该起作用,但是如果着色器程序还包含这样的顶点着色器呢:
顶点着色器:
...
uniform sampler2D samp1;
void main() { ... }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,OpenGL 应该将 的两个实例samp1视为引用相同的位置。因此,在顶点着色器和片段着色器中使用相同的纹理单元。我读过在两个不同的着色器阶段使用相同的纹理GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS会加倍计算,但这似乎与此矛盾。
在我的硬件 (HD 6870) 上的快速测试中,以下所有场景都按预期工作:
但是,我不知道这是否是我应该在所有硬件/驱动程序上预期的行为,或者是否存在性能影响。