我必须承认这是我第一次实现着色器,以前我只使用过固定功能管道; 但是,尽管我确信我所做的一切都是正确的 - 但一定有错误.
glLinkProgram(program)- GL_FALSE查询时返回GL_LINK_STATUS.此外,信息日志为空(当我查询日志长度 - 它是1,这是每个文档的空终止符,它检出).所以链接器错误,没有日志.另外,我刚刚发现链接器问题一旦我gl_Position在顶点着色器中使用变量,就会在赋值期间和我用它进行计算时出现.我尝试了各种各样的着色器变种,它出错了,但它无法生成日志 - 它似乎只是在GL_FALSE任何时候gl_Position被触及返回.有趣的是,片段着色器不会导致任何问题.
片段和顶点着色器都可以正常编译而没有错误.当我引入语法错误时,会检测,打印它们,并在程序创建之前中止该过程(因此它似乎工作正常).我调试并确保文件正确加载,源为空终止,大小正确,我在附件后检查附加程序的数量,它是2(正确的大声笑).为清楚起见,它被删除,我有checkForErrors()检查和打印opengl错误的方法 - 没有检测到.
我很难过,请有人帮忙!我已经失去了2天的睡眠时间......
这是加载着色器的代码:
FILE *file = fopen(fileName.c_str(), "rb");
if(file == NULL)
{
Log::error("file does not exist: \"" + fileName + "\"");
return NULL;
}
// Calculate file size
fseek(file , 0 , SEEK_END);
int size = ftell(file);
rewind(file);
// If file size is 0
if(size == 0)
{
Log::error("file is empty: \"" + fileName + "\""); …Run Code Online (Sandbox Code Playgroud) 我的崇高任务是摆脱单身人士和静态阶级.
背景:
我有以下结构:
问题:
问题是我试图摆脱所有的静态类(我现在变成了用于测试的单例),并且我使系统完全模块化并且松散耦合.这反过来阻止我进行Cmds可能指向的静态调用.
第一直觉是将函数从typedef更改为模板类,这将存储一个对象和方法,但它看起来非常混乱和复杂,我个人不舒服:
Cmd::create("toggleconsole", Console::toggle);
Run Code Online (Sandbox Code Playgroud)
至:
Cmd::create("toggleconsole", new FunctorObject<Console>(&Console::get(), &Console::toggle));
Run Code Online (Sandbox Code Playgroud)
最终的Cmd创建看起来非常模糊和误导谁负责Functor解除分配.
我也正在将Cmd创建从静态方法调用移动到Commander类中,所以它看起来像commander.createCmd("command_name",...); 而不是Cmd :: create("command_name",...); 这是因为Commander不再是静态的(或单例),因此它处理的所有命令都必须属于它.
但是,我完全不知道我的选项/替代方案是注册Cmds,并通过允许向Commander发出字符串命令来维持松散耦合.
我已经考虑过让每个主类派生自一个CmdListener类,它会在创建时用Commander注册该对象,然后在执行期间将命令传递给覆盖"onCmd(const Cmd&command)"的所有已注册对象.
这也留下了一些未解答的问题:Cmd将如何调用应该调用哪个类的方法?保持指针是没有意义的,并且会受到高度默默无闻的影响(如上所示).另外,我希望不为每个可以处理该cmd的类重新解释onCmd方法中的字符串.
这是很多信息,但有没有人对如何处理这个问题有任何想法?
此外,我的所有类都必须知道Commander和Console对象,它们不再是单例/静态.到目前为止,我已将它们放在Context对象中,并将它像一个小胶囊一样传递.关于如何解决这些后单例残留问题的任何想法?
这个项目是我个人的工作,我打算在我的简历上使用它 - 因此,我不希望我的潜在雇主看到任何单身人士(我也不想解释为什么,因为我可以证明他们自己并非真正必要).
万分感谢!
编辑:排版.
我已经读了一段时间了,我不确定我找到了一个好的答案.
我正在尝试设置一个包含92个结构的数组.它是一个固定的长度,不会改变,因为它实际上是一个查找表.我认为最好的方法是首先分配内存,calloc然后加载数据.
但经过一些阅读后,我看到很多人直接分配内存而没有calloc或malloc喜欢这样
myStruct myData[92] = { {1,2}, {3,4}, ....};
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是动态分配内存是否更好?我的理解是这是一个更好的解决方案.特别是如果数据不一定会一直使用.
我的第二个问题是关于初始化数据.我曾经读过我可以初始化一个结构,... = {....};但编译器不接受它.
这是我到目前为止的代码:
typedef struct {
int a;
int b;
} myStruct;
@implementation MyClass
static myStruct *myData;
-(id) init {
// ...
myData = (myStruct *) calloc(92, sizeof(myStruct));
myData[0] = {1,2}; // <=== Error ! Compiler says "Expected expression!"
// ...
Run Code Online (Sandbox Code Playgroud) 我需要一种方法来在运行时检查类型是否通过继承与匿名对象的类型(出于我的目的的 void 指针)相关。
假设我有两种类型:
class Base
{
public:
virtual ~Base();
};
class Derived : public Base
{
public:
~Derived();
};
Base *base = new Derived();
Derived *derived = new Derived();
Run Code Online (Sandbox Code Playgroud)
我需要实现以下功能:
template <typename T>
T *isRelated(void *obj, void *tag)
{
//If T is related to obj's real type (established based on tag value)
// return reinterpret_cast<T*>(obj);
//else
// return nullptr;
}
Run Code Online (Sandbox Code Playgroud)
目前,我可以通过在 typetag 中存储任何一个值(在编译时确定并作为值返回)并比较是否相等来检查 obj 是否与 T 类型相同。
换句话说,当前的 typetag 实现类似于:
template <typename T>
void *getTypeTag();
template <>
void …Run Code Online (Sandbox Code Playgroud)