Войти
ПрограммированиеФорумГрафика

SHADER на openGL C++

Страницы: 1 2 Следующая »
#0
18:57, 23 окт. 2012

всем привет !!! Я учу так называемые шейдеры так вот использую HLSL шейдеры но почему то не получается ? почему ?

#include<windows.h>
#include<GL/glew.h>
#include<GL/gl.h>

#pragma comment(lib,"OpenGL32")
#pragma comment(lib,"glew32.lib")

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

char szClassName[] = "MyClass";
int W = GetSystemMetrics(SM_CXSCREEN);
int H = GetSystemMetrics(SM_CYSCREEN);

GLuint Program;
GLuint AttribVertex;
GLuint unif_color;

struct vertex
{
GLfloat x;
GLfloat y;
};

void ShaderLog(unsigned int shader)
{
int infoLogen = 0;
int charWriten = 0;
char *infoLog;
glGetShaderiv(shader,GL_INFO_LOG_LENGTH,&infoLogen);
if(infoLogen>1)
{
infoLog = new char [infoLogen];

if(infoLog == NULL)
{
MessageBox(0,"Error in Buffer Shader","",0);
exit(0);
}
glGetShaderInfoLog(shader,infoLogen,&charWriten,infoLog);
MessageBox(0,infoLog,"",0);
delete [] infoLog;
}

}

void initShader()
{
  const char *vsSource = "attribute vec2 Coord;\n" 
    "void main(){\n"
    " glPosition = vec4(coord.xy,0.0,1.0);\n"
    "}\n";
       const char *fsSource = "uniform vec4 color;\n"
       "void main(){\n"
       " glFlagColor = color;\n"
       "}\n";
     GLuint vShader,fShader;
     vShader = glCreateShader(GL_VERTEX_SHADER);
     glShaderSource(vShader,1,&vsSource,NULL);
     glCompileShader(vShader);
     ShaderLog(vShader);
       
     fShader = glCreateShader(GL_FRAGMENT_SHADER);
     glShaderSource(fShader,1,&fsSource,NULL);
     glCompileShader(fShader);
     ShaderLog(fShader);

     Program = glCreateProgram();
     glAttachShader(Program,vShader);
     glAttachShader(Program,fShader);
     glLinkProgram(Program);

     int Link_OK;
     glGetProgramiv(Program,GL_LINK_STATUS,&Link_OK);
     if(!Link_OK)
     {
     MessageBox(0,"LINK NEW PROGRAM FALED","",0);
  
     }
      
     const char *attr_name = "coord";
     AttribVertex = glGetAttribLocation(Program,attr_name);
     if(AttribVertex == -1)
     {
     MessageBox(0,"Error AttribVertex","",0);
  
     }
     const char *unif_name = "color";
     unif_color = glGetUniformLocation(Program,unif_name);
     if(unif_color == -1)
     {
     MessageBox(0,"Error unif_color","",0);
     }
       
}

GLuint ID_BUFFER;
GLfloat CoordB[] = {-0.5f,-0.5f,
          0.5f,-0.5f,
          0.0f,0.0f};

void InitBuffer()
{
glGenBuffers(1,&ID_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER,ID_BUFFER);
glBufferData(GL_ARRAY_BUFFER,sizeof(CoordB),CoordB,GL_STATIC_DRAW);
}

void Draw()
{
  glUseProgram(Program);
  static float blue[] = {0.0f,0.0f,1.0f,0.0f};
  
  glUniform4fv(unif_color,1,blue);
  glEnableVertexAttribArray(AttribVertex);

glBindBuffer(GL_ARRAY_BUFFER,ID_BUFFER);
glVertexAttribPointer(AttribVertex,2,GL_FLOAT,GL_FALSE,0,0);
glDrawArrays(GL_QUADS,0,4);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MSG msg;
HWND hwnd;
WNDCLASS wc;
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
        wc.cbClsExtra = wc.cbWndExtra = 0;
        wc.lpfnWndProc = WndProc;
        wc.hInstance = hInstance;
        wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        wc.hCursor = LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground = NULL;
        wc.lpszMenuName = NULL;
        wc.lpszClassName = szClassName;
        if(!RegisterClass(&wc))
        {
        MessageBox(0,"Error RegisterClass","",0);
        return 0;
        }
            hwnd = CreateWindow(szClassName,"",WS_POPUP,0,0,W,H,0,0,hInstance,0);
                if(!hwnd)
                {
                return 0;
                }
                ShowWindow(hwnd,SW_SHOW);
                UpdateWindow(hwnd);
                while(GetMessage(&msg,0,0,0))
                {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
                }
                return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
  static HDC DC;
  static HGLRC RC;
  static int PixelFormat;
  static PIXELFORMATDESCRIPTOR pfd;

switch (msg)
{
case WM_CREATE:
      DC = GetDC(hwnd);
          memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR));
          pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
          PixelFormat = ChoosePixelFormat(DC,&pfd);
          SetPixelFormat(DC,PixelFormat,&pfd);
        RC = wglCreateContext(DC);
        wglMakeCurrent(DC,RC);
        glewInit();
        glEnableClientState(GL_VERTEX_ARRAY);
        glClearColor(0,0,0,0);
        initShader();
          InitBuffer();

  break;
case WM_PAINT:
  glClear(GL_COLOR_BUFFER_BIT);
  Draw();
  SwapBuffers(DC);
  break;
case WM_KEYDOWN:
  exit(0);
  return 0;
  break;
case WM_DESTROY:
  ReleaseDC(hwnd,DC);
  wglDeleteContext(RC);
  glDisableClientState(GL_VERTEX_ARRAY);
  glUseProgram(0);
    glDeleteProgram(Program);
  PostQuitMessage(0);
  return 0;
  break;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}

#1
19:02, 23 окт. 2012

Во-первых, не HLSL, а GLSL. Во-вторых, у тебя 3 координаты, а рисуешь 4.

#2
19:04, 23 окт. 2012

>всем привет !!! Я учу так называемые шейдеры так вот использую HLSL шейдеры но почему то не получается ? почему ?
Видимо что-то не правильно.

#3
19:16, 23 окт. 2012

а можно исправить код я только начал учить шейдеры

#4
19:28, 23 окт. 2012

wolf-9830
> а можно исправить код

А смысл ? :)

#5
19:30, 23 окт. 2012

innuendo а смысл в том чтобы люди учились ну в том числе и я

#6
19:49, 23 окт. 2012

innuendo
> А смысл ? :)
Поддерживаю.

wolf-9830
> а смысл в том чтобы люди учились ну в том числе и я
Если исправят за тебя код, не научишься. Сам должен допереть.

Да тем более даже ни книг не читал, ни примеры не смотрел. Даже в инет лень слазить, если "SHADER на openGL", а "использую HLSL".

#7
20:00, 23 окт. 2012

wolf-9830
То, что ты проверяешь логи компиляции шейдеров, конечно, хорошо, но glGetError тоже надо использовать.

> я только начал учить шейдеры
Ты в VBO сначала разберись.

#8
20:06, 23 окт. 2012

> case WM_PAINT:
> glClear(GL_COLOR_BUFFER_BIT);
> Draw();
> SwapBuffers(DC);
> break;
Бог мой. Отрисовка через сообщение окна.
Тебе до шейдеров как минимум полгода.
Признавайся от куда такую херню скопипастил. Мы этот сайт заDDOSим, что бы не распространял говно всякое (шутка).

#9
22:08, 24 окт. 2012

wolf-9830
Переходи на Unity, все специалисты по HLSL уже давно на нем работают... OpenGL уже давно устарел, HLSL в юнити норррм =)))

#10
21:13, 25 окт. 2012

asvp
Ты не умеешь рисовать в WM_PAINT?

ai-music
Провокатор )

#11
22:06, 25 окт. 2012

nes
> Ты не умеешь рисовать в WM_PAINT?
Умею, но не делаю.

#12
10:30, 26 окт. 2012

nes
> Ты не умеешь рисовать в WM_PAINT?
ai-music
> Переходи на Unity, все специалисты по HLSL уже давно на нем работают... OpenGL
> уже давно устарел, HLSL в юнити норррм =)))
ага, все такие взрослые дядьки собрались и давай издеваться над школьником.

#13
16:11, 26 окт. 2012

wolf-9830
WM_PAINT - не нужно.

Код шейдера хранить в коде движка\программы это мерзко.
Сделай чтение из файла самому же удобней будет.

в WM_CREATE
> glEnableClientState(GL_VERTEX_ARRAY);
По идее не критично но не ясно зачем. Включай только когда геометрию отправляешь.

в WM_DESTROY
> ReleaseDC(hwnd,DC);
> wglDeleteContext(RC);
> glDisableClientState(GL_VERTEX_ARRAY);
> glUseProgram(0);
> glDeleteProgram(Program);
Ты используешь OpenGL функции после удаления контекста - не надо так делать.

>glBufferData
Читай спек.
http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml


>GLfloat CoordB[] = {-0.5f,-0.5f,
> 0.5f,-0.5f,
> 0.0f,0.0f};

>glDrawArrays(GL_QUADS,0,4);
You're doing it wrong.

>glFlagColor
flag?

Все что заметил беглым осмотром. Советую начать думать когда кодишь.

#14
18:17, 26 окт. 2012

ai-music
> OpenGL уже давно устарел
Да неужели? И каких это пор?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.