Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何实现glMultMatrixf_C_Opengl - Fatal编程技术网

C 如何实现glMultMatrixf

C 如何实现glMultMatrixf,c,opengl,C,Opengl,我正在研究矩阵积函数,我是C语言的新手。这就是我想到的 static float *currentMatrix; ... glMultMatrixf(const float *m){ int i; int i2=0; int i3=0; float result[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; printf("starting \n"); for(i=0; i < (MATRIX_HEIGHT); i++){ f

我正在研究矩阵积函数,我是C语言的新手。这就是我想到的

static float *currentMatrix;
...
glMultMatrixf(const float *m){
  int i;
  int i2=0;
  int i3=0;
  float result[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  printf("starting \n");
  for(i=0; i < (MATRIX_HEIGHT); i++){
    float dotProduct = 0.0f;
    for(i2=0; i2 < (MATRIX_WIDTH); i2++){
      float dotProduct = 0.0f;
      for(i3=0;i3 < (MATRIX_WIDTH); i3++){
        dotProduct+=currentMatrix[i3+i*4]*m[i3*4+i2];
      }
      result[i2+i*4]=dotProduct;
    }
  }
  currentMatrix = &result[0];
  printf("Finished \n");
}
静态浮点*电流矩阵;
...
glMultMatrixf(常量浮点*m){
int i;
int i2=0;
int i3=0;
浮点结果[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
printf(“启动\n”);
对于(i=0;i<(矩阵高度);i++){
浮点数积=0.0f;
对于(i2=0;i2<(矩阵宽度);i2++){
浮点数积=0.0f;
对于(i3=0;i3<(矩阵宽度);i3++){
点积+=电流矩阵[i3+i*4]*m[i3*4+i2];
}
结果[i2+i*4]=点积;
}
}
currentMatrix=&结果[0];
printf(“完成的”\n);
}
当然,由于结果的范围,这是失败的

这确实有效

static float *currentMatrix;
float result[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
...
glMultMatrixf(const float *m){
  int i;
  int i2=0;
  int i3=0;

  printf("starting \n");
  for(i=0; i < (MATRIX_HEIGHT); i++){
    float dotProduct = 0.0f;
    for(i2=0; i2 < (MATRIX_WIDTH); i2++){
      float dotProduct = 0.0f;
      for(i3=0;i3 < (MATRIX_WIDTH); i3++){
        dotProduct+=currentMatrix[i3+i*4]*m[i3*4+i2];
      }
      result[i2+i*4]=dotProduct;
    }
  }
  currentMatrix = &result[0];
  printf("Finished \n");
}
静态浮点*电流矩阵;
浮点结果[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
...
glMultMatrixf(常量浮点*m){
int i;
int i2=0;
int i3=0;
printf(“启动\n”);
对于(i=0;i<(矩阵高度);i++){
浮点数积=0.0f;
对于(i2=0;i2<(矩阵宽度);i2++){
浮点数积=0.0f;
对于(i3=0;i3<(矩阵宽度);i3++){
点积+=电流矩阵[i3+i*4]*m[i3*4+i2];
}
结果[i2+i*4]=点积;
}
}
currentMatrix=&结果[0];
printf(“完成的”\n);
}
但这似乎不正确,因为如果多个线程同时调用函数,这可能会导致问题(请记住,我是C新手)


所以我真的不知道防止GC破坏这些对象的正确方法。我当然可以遍历temp数组并在常规数组中设置值,但这似乎效率低下。是否有更好的方法来处理此问题?

您正在尝试实现OpenGL例程
glMultMatrix
。关于如何返回结果,没有选择。OpenGL有一些“当前矩阵”的概念。我不熟悉OpenGL。我假设当前矩阵是某个全局或线程特定状态的一部分,因为它没有作为参数传递给
glMultMatrix
。要实现
glMultMatrix
,还必须实现OpenGL的全局状态。看来你必须学习一些关于OpenGL的知识

鉴于
glMultMatrix
必须同时从当前矩阵读取和写入,并且操作无法就地执行(除非使用大量临时变量),因此您有两种选择:

  • 在临时矩阵中生成结果,然后将临时矩阵复制到当前矩阵。或者,等效地,将当前矩阵复制到临时矩阵,然后使用临时矩阵进行输入,同时在当前矩阵中生成结果
  • 将当前矩阵作为指向两个或多个实际矩阵的指针进行维护。在诸如
    glMultMatrix
    之类的例程中,从当前指向的当前矩阵版本读取数据,然后写入矩阵的其他版本。在例程结束时,将指针更改为指向新结果

后一个选项相对简单,不会占用过多的空间,因为当前矩阵很小。变化是可能的,例如通常只保留一个当前矩阵,但根据需要为其他矩阵分配空间,并使用指针指示哪一个是真实的当前矩阵。

看起来+FVU是正确的,memcpy似乎可以工作

glMultMatrixf(const float *m){
  int i;
  int i2=0;
  int i3=0;
  printf("starting \n");
  float result[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  for(i=0; i < (MATRIX_HEIGHT); i++){
   float dotProduct = 0.0f;
   for(i2=0; i2 < (MATRIX_WIDTH); i2++){
     float dotProduct = 0.0f;
     for(i3=0;i3 < (MATRIX_WIDTH); i3++){
       printf("Multiplying... currentLoc %d New M Loc %d | %f * %f", i3+i*4, i3*4+i2, currentMatrix[i3+i*4],m[i3*4+i2]);
       dotProduct+=currentMatrix[i3+i*4]*m[i3*4+i2];
       printf(" Dot Product = %f \n", dotProduct);
     }
     result[i2+i*4]=dotProduct;
   }
  }

  memcpy(currentMatrix, &result, 16 * sizeof(float) );
  printf("Finished \n");
}
glMultMatrixf(常量浮点*m){
int i;
int i2=0;
int i3=0;
printf(“启动\n”);
浮点结果[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
对于(i=0;i<(矩阵高度);i++){
浮点数积=0.0f;
对于(i2=0;i2<(矩阵宽度);i2++){
浮点数积=0.0f;
对于(i3=0;i3<(矩阵宽度);i3++){
printf(“乘以……当前位置%d新的M位置%d |%f*%f”,i3+i*4,i3*4+i2,当前矩阵[i3+i*4],M[i3*4+i2]);
点积+=电流矩阵[i3+i*4]*m[i3*4+i2];
printf(“点产品=%f\n”,点产品);
}
结果[i2+i*4]=点积;
}
}
memcpy(当前矩阵和结果,16*sizeof(float));
printf(“完成的”\n);
}

这里有一个实现:
[R]
matrix4\u mul(R,a,b)
简单的ISO C90。结果:
(r)
可以别名
(x)
和/或
(y)
。它还没有经过测试:

/* inline */ void
matrix4_mul (float r[16], const float a[16], const float b[16])
{
    float t[16]; /* (tmp result) */
    int i, j, k;

    for (i = 0; i < 4; i++)
    {
        const float *ai = a + (i * 4);
        float *ti = t + (i * 4);

        for (j = 0; j < 4; j++)
        {
            float tij = 0.0;

            for (k = 0; k < 4; k++)
                tij += ai[k] * b[k * 4 + j];

            ti[j] = tij; /* r[i][j] (inner product) */
        }
    }

    for (i = 0; i < 16; i++) /* copy elements back to result: */
        r[i] = t[i];
}
/*内联*/void
matrix4_mul(浮点r[16],常量浮点a[16],常量浮点b[16])
{
浮点t[16];/*(tmp结果)*/
int i,j,k;
对于(i=0;i<4;i++)
{
常量浮点*ai=a+(i*4);
浮点数*ti=t+(i*4);
对于(j=0;j<4;j++)
{
浮点数tij=0.0;
对于(k=0;k<4;k++)
tij+=ai[k]*b[k*4+j];
ti[j]=tij;/*r[i][j](内积)*/
}
}
对于(i=0;i<16;i++)/*将元素复制回结果:*/
r[i]=t[i];
}
任何行主要问题与列主要问题都取决于
[A]
[B]
的顺序



如果要模拟
glMultMatrixf
的行为,需要维护当前矩阵/矩阵堆栈的概念。至少此函数可以执行实际的连接。

不幸的是,这是一个端口,因此更改参数不是一个选项。第二个我可以看到工作,但似乎复制数组更安全(如果我忘记释放怎么办)。如果有一种方法可以在不(显式)迭代的情况下复制数组值,那将是理想的。我将在C中重新研究它,所以我没有想到这是一个允许您更改
glMultMatrixf
实现但不允许其声明的端口?以前的实现如何返回结果?声明是什么(它是否返回一个值)?@EricPostpischil非常有效的评论-从它通过共享变量的外观来看,将线程改装到该program是非常危险的…@EricPostpischil我不确定,我不确定在哪里可以找到OpenGL ES1.1的实现代码我假设它