在Visual Studio 2010/2011中缺少可变参数模板(仍然!)时,采用大量参数的构造函数可能会出现问题.例如,以下内容将无法编译:
MyMaterials.push_back(std::make_shared<Material>(MyFacade,
name,
ambient,
diffuse,
specular,
emissive,
opacity,
shininess,
shininessStrength,
reflectivity,
bumpScaling,
maps,
mapFlags));
Run Code Online (Sandbox Code Playgroud)
,因为它有13个参数,我认为make_shared是从arg0限制到arg9.显而易见的解决方案是两部分构建,但我希望避免这种情况.除了使用new而不是make_shared 之外,还有其他可能吗?
谢谢.
给定以下模板化函数,如何更改它以利用可变参数模板?也就是说,用一个可变参数而不是P1和P2替换std :: bind占位符?目前我每个arity都有这些函数之一,arity为零,没有P参数,直到具有P1到P9参数的arity 9.如果可能的话,我希望将其合并为一个功能.
template<typename R, typename T, typename U, typename P1, typename P2>
void Attach(R (T::*f)(P1, P2), U p)
{
AttachInternal(p, std::bind(f,
p.get(),
std::placeholders::_1,
std::placeholders::_2));
}
Run Code Online (Sandbox Code Playgroud) 我一直在阅读Gamma等人的Design Patterns.与依赖注入相比,我有一个关于模板方法的问题.
使用模板方法,您可以使用策略"模板化"类,这些策略提供所需操作或计算的替代方法.因此,不是从多个备选方案中选择一个策略并将该策略编码到类中,而是允许类的用户指定他们想要使用的备选方案.
这听起来对我来说非常合理.但我打了一个概念性的砖墙.
如果使用策略对象实例化类,则策略对象需要实现抽象接口.然后,程序员可以编写所有编译到类中的不同策略,而不会出现错误,因为策略实现了接口.使用策略的类将编码到策略接口而不是实现.
如果您要IPolicy为这些策略对象定义一个摘要,为什么不只是使用依赖注入并传入IPolicy构造?
任何人都可以解释为什么你更喜欢模板方法依赖注入?
我从切线空间法线贴图着色器得到了一些非常奇怪的结果:).在我在这里展示的场景中,茶壶和方格的墙壁被我的普通Phong-Blinn着色器遮住(显然茶壶背面剔除给它一个轻微的短暂外观和感觉:-)).我试图将常规映射添加到球体中,并带有迷幻效果:

光线来自右边(就像黑色斑点一样可见).我在球体上使用的法线贴图如下所示:

我正在使用AssImp来处理输入模型,所以它会自动为我计算每个顶点的正切和双法线.
像素和顶点着色器在下面.我不太确定会出现什么问题,但如果切线基础矩阵在某种程度上是错误的话,我也不会感到惊讶.我假设我必须将事物计算到眼睛空间然后将眼睛和光线矢量转换为切线空间,这是正确的方法.请注意,灯光位置已进入视图空间中的着色器.
// Vertex Shader
#version 420
// Uniform Buffer Structures
// Camera.
layout (std140) uniform Camera
{
mat4 Camera_Projection;
mat4 Camera_View;
};
// Matrices per model.
layout (std140) uniform Model
{
mat4 Model_ViewModelSpace;
mat4 Model_ViewModelSpaceInverseTranspose;
};
// Spotlight.
layout (std140) uniform OmniLight
{
float Light_Intensity;
vec3 Light_Position; // Already in view space.
vec4 Light_Ambient_Colour;
vec4 Light_Diffuse_Colour;
vec4 Light_Specular_Colour;
};
// Streams (per vertex)
layout(location = 0) in vec3 attrib_Position;
layout(location = 1) in vec3 attrib_Normal;
layout(location = …Run Code Online (Sandbox Code Playgroud) 我正在尝试绑定一个我想解释为Alpha,Luminance或Intensity的纹理.我正在使用OpenGL 4.0.我可以将它们绑定为GL_RED OK没有问题,即:
glTexImage2D( GL_TEXTURE_2D,
i,
GL_RED,
mipSizeX,
mipSizeY,
0,
GL_RED,
GL_UNSIGNED_BYTE,
nullptr);
Run Code Online (Sandbox Code Playgroud)
但是每当我尝试绑定为GL_ALPHA,GL_LUMINANCE或GL_INTENSITY时,我都会收到错误1280.这些格式是否因GL 4.0而弃用,或者我做错了什么?例如,这失败了:
glTexImage2D( GL_TEXTURE_2D,
i,
GL_ALPHA8
mipSizeX,
mipSizeY,
0,
GL_ALPHA,
GL_UNSIGNED_BYTE,
nullptr);
Run Code Online (Sandbox Code Playgroud)
编辑:好的,因为这些格式已被弃用,此页面包含显示实际有效格式的表格.
这种情况最近已经开始发生(不太可能不确定是什么导致了这种变化),但我不能再选择控件了.我对此的解读发现了一些可能的解释,包括:
对于(1),不,它肯定没有运行,因为(2)我的表格来自DevComponents.DotNetBar.RibbonForm.对于(3),不,它们没有"锁定"(我试图锁定然后解锁,以防某些状态被困在设计师中,但没有骰子).控件在我的表单上,而不是基类表单,并且实例不是私有的(我故意公开它们只是为了测试这个)并且它们之前工作正常.
那么,我该怎么办?我可以从"属性"窗口下拉列表中选择一个控件,如ComboBox,更改其属性等.但是当我选择它时,设计师没有选择任何东西.我可以选择表单本身(通过其边框)并在设计器中调整它的大小.我可以添加一个新的控件,如标签,并在设计器中与它进行良好的交互,所以这是我现有控件发生的事情.
我敢肯定这是一个非常愚蠢的东西,或者Visual Studio 2012正在结束.
任何人?
编辑:将解决方案拉上并将其带回家.清理和重建,它在设计师工作正常.不管怎样,我想我的安装工作存在问题.
我有一个基于HTML5画布的Javascript组件,需要捕获和释放鼠标事件.在控件中,用户单击其中的区域并拖动以影响更改.在PC上我希望用户能够继续在浏览器外拖动,并且如果按钮在窗口外释放,则画布可以接收鼠标按下事件.
但是,据我所知,Chrome不支持setCapture和releaseCapture.
有解决方法吗?
我正在创建这样的跟踪侦听器:
// Setup log tracing.
Trace.Listeners.Add(new TextWriterTraceListener(MyLogPath));
Trace.AutoFlush = true;
Trace.WriteLine(DateTime.Now.ToString() + "-" + " Program started");
Run Code Online (Sandbox Code Playgroud)
当我检测到文件太大时,我想要截断它(或者更确切地说,只取最后N行).为了做到这一点,我想读取文件,但似乎无关紧要的是跟踪侦听器锁定它,即尝试删除跟踪侦听器并像这样处理它的流:
// Clear logging.
Trace.Listeners[0].Close();
Trace.Listeners[0].Dispose();
Trace.Listeners.Clear();
Run Code Online (Sandbox Code Playgroud)
,在读这样之前:
// Read in existing log.
string[] lines = File.ReadAllLines(MyLogPath);
Run Code Online (Sandbox Code Playgroud)
,给我一个IO异常(文件正由另一个进程使用).
有什么想法吗?
我一直在谷歌搜索OpenGL二进制格式以及它们实际上是什么意思.到目前为止,我没有取得多大成功.我知道我可以获取如下数字和格式集:
::glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, &values[0]);
Run Code Online (Sandbox Code Playgroud)
,其中values是一个大小为整数的std :: vector:
::glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &value);
Run Code Online (Sandbox Code Playgroud)
对于我机器中的驱动程序,这将返回单个二进制格式.这只是一个数字而对我来说毫无意义.
所以我的问题如下:
(1)格式数/代码代表什么?(2)是否有标准的ARB二进制格式,或者它们是否都依赖于供应商?(3)供应商之间是否存在通用格式?(4)如果有多种格式,你应该如何在它们之间做出选择?
我有一种模糊的感觉,我必须在给定的机器上预编译和缓存着色器才能利用这一点.我的意思是它不像DX那样,你可以将着色器编译器作为后期构建事件运行并将它们打包在一起并在任何带有D3D的(Windows)机器上使用它们.
我想这是纯C ++问题和OpenGL问题之间的一种交叉。我有一个统一的缓冲区,正在其中分配sizeof(ShaderData)字节的空间。我在着色器的GPU端使用std140布局。
根据std140规则,我需要在结构的各个位置添加填充以确保矢量正确对齐。下面的结构是一个示例(针对我的观点):
struct ShaderData {
float Light_Intensity;
float _pad1[3]; // align following vec3 on 4N boundary
Math::Vec3f Light_Position;
float _pad2; // align following vec4 on 4N boundary
Math::Colour4f Light_Ambient;
Math::Colour4f Light_Diffuse;
Math::Colour4f Light_Specular;
float Light_AttenuationMin;
float Light_AttenuationMax;
} MyShaderData;
Run Code Online (Sandbox Code Playgroud)
这是人们通常用C ++进行操作的方式吗?还是有一些特殊的关键字或实用说明来使结构CPU端的各个元素对齐?