有没有办法,我可以有效地在两个相似的功能集(C/C++)之间切换?为了更好地解释我的意思,让我说我有两组全局函数,如:
void a_someCoolFunction();
void a_anotherCoolFunction(int withParameters);
…
void b_someCoolFunction();
void b_anotherCoolFunction(int withParameters);
…
Run Code Online (Sandbox Code Playgroud)
我希望能够在运行时"切换"我的程序中使用哪一个.但是:我不想在每个功能上都有一个条件,例如:
void inline someCoolFunction(){
if(someState = A_STATE){
a_someCoolFunction();
}else{
b_someCoolFunction();
}
}
Run Code Online (Sandbox Code Playgroud)
因为,我希望在我的主循环中调用每个函数 - 所以如果我可以做这样的事情(在我的mainloop的开头或someState被更改时)会更好:
if(someState = A_STATE){
useFunctionsOfType = a;
}else{
useFunctionsOfType = b;
}
Run Code Online (Sandbox Code Playgroud)
然后简单地打电话
useFunctionsOfType _someCoolFunction();
Run Code Online (Sandbox Code Playgroud)
我希望它可以理解我的意思......我的背景:我写一个应用程序,这应该能够处理的OpenGL ES 1.1和OpenGL ES 2.0都正常-但我不想写的每一个渲染方法2倍(如:renderOpenGL1()
和renderOpenGL2()
我宁愿只写render()
).我已经有类似的方法:glLoadIdentity(); myLoadIdentity();
......但需要一种方法在这两种方式之间切换.有没有办法以高效的方式实现这一目标?
我正在尝试解决一个问题,要求在一个字符串中找到最多20,000个字符的最大回文.我试图检查每个子字符串是否是回文,这是有效的,但显然太慢了.经过一番谷歌搜索后,我发现了这个很好的算法 http://stevekrenzel.com/articles/longest-palnidrome.我试图实现它,但我不能让它工作.给定的字符串也包含非法字符,因此我必须将其转换为合法字符并输出最长的回文并包含所有字符.
这是我的尝试:
int len = original.length();
int longest = 0;
string answer;
for (int i = 0; i < len-1; i++){
int lower(0), upper(0);
if (len % 2 == 0){
lower = i;
upper = i+1;
} else {
lower = i;
upper = i;
}
while (lower >= 0 && upper <= len){
string s2 = original.substr(lower,upper-lower+1);
string s = convert(s2);
if (s[0] == s[s.length()-1]){
lower -= 1;
upper += 1;
} else {
if (s.length() > …
Run Code Online (Sandbox Code Playgroud) 我正在使用带有PointSprites的ParticleSystem(受Cocos2D Source的启发).但我想知道如何重建OpenGL ES 2.0的功能
glEnable(GL_POINT_SPRITE_OES);
glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2));
glDisableClientState(GL_POINT_SIZE_ARRAY_OES);
glDisable(GL_POINT_SPRITE_OES);
Run Code Online (Sandbox Code Playgroud)
这些在使用OpenGL ES 2.0上下文时生成BAD_ACCESS.我应该每个PointSprite只使用2个TRIANGLES吗?但那可能不是很有效(额外顶点的开销).
编辑:所以,我的建议解决方案的新问题来自:https: //gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528
可以在批量调用中传递许多不同的大小.我想过使用Attribute而不是Uniform,但是我需要总是将PointSize传递给我的着色器 - 即使我没有绘制GL_POINTS.那么,也许是第二个着色器(仅用于GL_POINTS的着色器)?!我不知道在绘制例程中每一帧切换着色器的开销(因为如果使用粒子系统,我自然也想渲染没有pointSize的常规GL_TRIANGLES)......有什么想法吗?
我想完成一个GLSL着色器,它可以对我的顶点对象进行纹理和着色.事实上,它适用于3个案例中的2个:
1)如果我只分配了一个纹理(但没有特定的颜色 - 所以颜色是"白色"),我只是得到一个纹理对象 - 工作
2)如果我有一个纹理和一个颜色分配,我得到一个用该颜色调制的纹理对象 - 工作
3)如果我只分配了颜色但没有纹理,我会得到一个黑色物体 - 不起作用
我的着色器看起来像这样:
varying lowp vec4 colorVarying;
varying mediump vec2 texcoordVarying;
uniform sampler2D texture;
void main(){
gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying;
}
Run Code Online (Sandbox Code Playgroud)
我想,如果没有分配纹理,texture2D(...,...)将返回零 - 所以这似乎是问题所在.如果没有分配纹理(在这种情况下,我只想要gl_FragColor = colorVarying;),我可以检查GLSL吗?
"如果"在GLSL着色器中不是一个真正的选项,如果我没有正确理解 - 有任何想法可以实现这一目标吗?或者是否真的有必要为两种情况制作2种不同的着色器?
我正在尝试使用Visual Studio 2010的MinGW(版本4.7.2)来使用一些新的C++ 11功能(遗憾的是我仍然使用WindowsXP并且不能使用Visual Studio 2012).首先,我创建了一个项目:File - > New Project - > Visual C++ - > General - > Makefile-Project
General:
Build Command Line: mingw32-make.exe
Rebuild All Command Line: mingw32-make.exe rebuild all
Clean Command Line: mingw32-make.exe clean all
IntelliSense:
Include Search Path: C:\MinGW\lib\gcc\mingw32\4.7.2\include\c++;C:\MinGW\include;
Assembly Search Path: C:\MinGW\lib\gcc\mingw32\4.7.2;C:\MinGW\lib;
Additional Arguments: -std=c++11
Run Code Online (Sandbox Code Playgroud)
我创建了一个包含内容的makefile:
all:
g++ -std=c++11 -pthread -o Makefile_Test.exe main.cpp
Run Code Online (Sandbox Code Playgroud)
它编译得很好,但在Visual Studios编辑器中几乎所有东西都是波浪形的红色.即
std::vector<std::thread> threads;
Run Code Online (Sandbox Code Playgroud)
std::vector
- >'错误:命名空间std没有成员向量'
std::thread
- >'错误:命名空间std没有成员线程'
甚至 std::cout << "";
std::cout
- >'错误:命名空间std没有成员cout'
但是我当然包括了相应的标题:Visual Studio甚至可以找到它们(将光标放在#include - > Ctrl …
我有一个VS 12解决方案与我自己的项目,这取决于一些依赖项(使用cmake生成的项目文件).我使用cmake生成了这些VS12项目,并将这些项目添加到我的解决方案中(使用相对路径).然后我不得不调整这些项目的输出目录,在我自己的项目可以找到的其他地方构建目标(所以在路径更改后再次运行cmake不能解决我的问题,因为我必须编辑所有项目然后再)).
如果现在解决方案的绝对路径发生变化,解决方案仍然可以找到项目 - 但是在构建时我从cmake收到错误,"旧路径"不存在.
重现我的问题的步骤:
C:\cmake
C:\cmake\build
C:\cmake\build
cmake ..
C:\cmake
目录重命名为C:\cmake2
C:\cmake2\build\CMake.sln
会出现一个包含错误的长列表(这里包括完全包含的时间太长) - 所有这些都是因为旧路径"C:\ cmake \"仍在某处使用而导致的.一个例子:
1>------ Build started: Project: ZERO_CHECK, Configuration: Debug Win32 ------
2>------ Skipped Build: Project: RUN_TESTS, Configuration: Debug Win32 ------
2>Project not selected to build for this solution configuration
1> Checking Build System
1> CMake is re-running because C:/cmake/build/CMakeFiles/generate.stamp dependency file is missing.
1>CUSTOMBUILD : CMake error : The source directory "C:/cmake" does …
Run Code Online (Sandbox Code Playgroud) 我试图在编译时将函数的模板类型限制为特定类及其子类。为了实现这一点,我使用类型特征std::enable_if_t
,std::is_base_of
如下所示:
template <typename T = std::enable_if_t<std::is_base_of<A, T> > >
Run Code Online (Sandbox Code Playgroud)
但模板仍然使用不属于继承层次结构(即int
)的类型进行编译。下面是该问题的 MCVE:
class A {
public:
A(float a) : a(a) {}
float a;
};
class B : public A{
public:
B(float a) : A(a) {}
};
template <typename T = std::enable_if_t<std::is_base_of<A, T> > >
void templateFunction(T a) {
}
int main() {
templateFunction<A>(A(1.0f)); // OK -> std::is_base_of<A, A>
templateFunction<B>(B(1.0f)); // OK -> std::is_base_of<A, B>
templateFunction<int>(1); // Should not compile! int is not a subclass of …
Run Code Online (Sandbox Code Playgroud) 我在我的openGL应用程序中加载一个bitmapfont(作为png图像),以固定大小从那里渲染字符.那很有效.但是:如果我想缩小一些较小尺寸的字形,它看起来并不好看.有没有办法 - 不使用预生成的mipmap(我有一大堆几个字符,需要无级的大小)来扩展它更美丽?插值的某种方式还是什么?
目前我使用的是这样的东西(Mac OS X上的C/C++):
glPopMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, texture->getID());
glScalef(0.7f, 0.7f, 0); //scale here a size
{draw vertexes & set texcoords}
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glPushMatrix();
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
如果父类具有纯虚拟析构函数,我该如何正确继承它?我有一个头文件(由IBM Rational Rose生成),如下所示:
class MyClass{
protected:
inline MyClass() {};
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
public:
inline virtual ~MyClass() = 0;
virtual void someMethod() = 0;
};
Run Code Online (Sandbox Code Playgroud)
现在我想实现这个纯抽象类 - 即
class MyClassImpl : public MyClass {
public:
MyClassImpl(){}
virtual void someMethod() {}
};
int main(int argc, char*argv[]) {
MyClassImpl impl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但无论我尝试什么(即在MyClassImpl中定义析构函数;虚拟/非虚拟),我都会收到错误消息:error LNK2019: unresolved external symbol "public: virtual __thiscall MyClass::~MyClass(void)" (??1MyClass@@UAE@XZ) referenced in function "public: virtual __thiscall MyClassImpl::~MyClassImpl(void)" (??1MyClassImpl@@UAE@XZ)
.
有没有办法在MyClassImpl
没有变化的情况下实施MyClass
?
我已将 HLSL 着色器添加到我的 Visual Studio 项目中,并且作为构建过程的一部分,它们会自动编译为 cso 文件。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为“/4_0_level_9_3”适用于 DirectX 11,但不适用于 DirectX 9,而“/3_0”仅适用于 DirectX 9,但不适用于在 DirectX 11 上。
向 Visual Studio 项目多次添加相同的文件不起作用,我想避免复制 HLSL 源文件,因为它会增加维护工作量和潜在的错误原因。我也无法在 Visual Studio 中创建单独的目标/配置来实现此目的,因为我需要在可执行文件中支持两个 DirectX 版本(可在运行时切换)。
有没有办法在 Visual Studio 中为单个 HLSL 文件指定多个编译(不同的着色器模型和不同的输出文件)?
c++ ×5
glsl ×2
algorithm ×1
bitmap-fonts ×1
c ×1
c++11 ×1
c++14 ×1
cmake ×1
directx-11 ×1
directx-9 ×1
function ×1
hlsl ×1
inheritance ×1
ios ×1
mingw ×1
opengl ×1
opengl-es ×1
palindrome ×1
performance ×1
sfinae ×1
string ×1
templates ×1
type-traits ×1