Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Cdvig
9 / 9 / 4
Регистрация: 08.10.2009
Сообщений: 173

Неправильно отображается цвет Directx

17.12.2011, 13:04. Показов 2191. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разбирая присер из книги Миллер Т. DirectX 9 с управляемым кодом. Программирование игр и графика. 2005. наткнулся на проблему некоректного отображения цвета фигуры из VertexBuffer
вот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
 
namespace DirectX
{
    class Program
    {
 
        static void Main()
        {
            using (Form1 frm = new Form1())  // Show our form and initialize our graphics engine 
            {
                frm.Show();
                frm.InitializeGraphics();
                Application.Run(frm);
            }
        }
    }
    class Form1 : Form
    {
 
        private Device device = null;
        private VertexBuffer vb = null;
        /// <summary> 
        /// We will initialize our graphics device here 
        /// </summary> 
        public void InitializeGraphics()
        {
            // Set our presentation parameters
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
            PresentParameters presentParams = new PresentParameters();
            presentParams.Windowed = true;
            presentParams.SwapEffect = SwapEffect.Discard;
            // Create our device 
            device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
            CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[3];
            
            vb = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
            vb.Created += new EventHandler(this.OnVertexBufferCreate);
            OnVertexBufferCreate(vb, null);
            
            device.DeviceResizing += new CancelEventHandler(this.CancelResize);
        }
        float angle = 50;
        private void SetupCamera()
        {
 
            device.RenderState.Lighting = true;
            //device.RenderState.CullMode = Cull.None;
            device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 100.0f);
            device.Transform.View = Matrix.LookAtLH(new Vector3(0, 3, 5.0f), new Vector3(), new Vector3(0, 1, 0));
            //device.Transform.World = Matrix.RotationYawPitchRoll(angle / (float)Math.PI, angle / (float)Math.PI * 2.0f, angle / (float)Math.PI);
            //angle += 0.1f;
        }
        private void CancelResize(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
        }
        private void OnVertexBufferCreate(object sender, EventArgs e)
        {
            VertexBuffer buffer = (VertexBuffer)sender;
            CustomVertex.PositionColored[] verts = new
            CustomVertex.PositionColored[3];
            verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f);
            verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f);
            verts[1].Color = System.Drawing.Color.Black.ToArgb();
            verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f);
            verts[2].Color = System.Drawing.Color.Purple.ToArgb();
            buffer.SetData(verts, 0, LockFlags.None);
           
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            device.Clear(ClearFlags.Target, System.Drawing.Color.CornflowerBlue, 1.0f, 0);
            SetupCamera();
            
            device.Lights[0].Type = LightType.Point;
            device.Lights[0].Position = new Vector3();
            device.Lights[0].Diffuse = System.Drawing.Color.White;
            device.Lights[0].Attenuation0 = 0.2f;
            device.Lights[0].Range = 10000.0f;
            device.Lights[0].Enabled = true;
            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionNormalColored.Format; 
            device.SetStreamSource(0, vb, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 12);
            device.EndScene();
            this.Invalidate();
            device.Present();            
        }
    }
}
Название: Form.jpg
Просмотров: 179

Размер: 13.4 Кб
Судя по коду цвет у треугольника должен быть другой.
Может кто сталкивался с этой проблемой или знает, как её решить?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2011, 13:04
Ответы с готовыми решениями:

Воспроизведение видео на форме с помощью DirectX (в референсах ничего не отображается)
Стоит задача воспроизведения видео на форме с помощью DirectX Вот нашёл небольшую вводную статью: ...

Неправильно отображается Picturebox на другом компьютере
Доброе время суток всем форумчанам. Пишу приложение в котором на главной форме находится PictureBox с выставленной в Image картинкой. Для...

Неправильно отображается ASP страница
Добрый день Подскажите пожалуйста.Я создаю обычный ASP.Net Web Site приложение. Запускаю его . Вверху...

3
 Аватар для Cdvig
9 / 9 / 4
Регистрация: 08.10.2009
Сообщений: 173
17.12.2011, 16:24  [ТС]
Проблему решил вот если кому интерестно
Заменил
C#
1
vb = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
на
C#
1
vb = new VertexBuffer(typeof(CustomVertex.PositionNormalColored), 3,device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalColored.Format, Pool.Default);
добавил в OnVertexBufferCreate
C#
1
2
3
verts[0].Normal = (new Vector3(0.0F, 0.0F, -1.0F));
            verts[1].Normal = (new Vector3(0.0F, 0.0F, -1.0F));
            verts[2].Normal = (new Vector3(0.0F, 0.0F, -1.0F));
и зпменил
C#
1
CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[3];
на
C#
1
CustomVertex.PositionNormalColored[] verts = new   CustomVertex.PositionNormalColored[3];
1
82 / 58 / 0
Регистрация: 29.01.2013
Сообщений: 254
Записей в блоге: 1
23.12.2013, 23:30
Да, странное явление с чередованием цвета вершин. Я почти скопировал ваш код (конечно, не удержался и кое-что сделал по-своему, но цвета указывал так же), и у меня цвет вершин оказался распределен правильно. У меня другая проблема: в среде VS2010 не работает второй пример из той же книги Миллера (без буфера), но я на него плюнул, поскольку в дальнейшем не собираюсь все вершины указывать в теле программы. Так что, Вы мне крупно помогли своим кодом, за что Вам большой респект! А я уже не знал, что и думать, уже грешил на карту - а оказалось, что какой-то глюк, видимо, в отображении треугольника из массива его вершин в функции DrawUserPrimitives. Давайте не будем зацикливаться на своих особенностях сочетаний DirectX 9 с Visual Studio, а будем двигаться дальше!

Добавлено через 2 минуты
Да, чуть не забыл: у Вас DrawPrimitives рисует 12 треугольников вместо одного.
0
82 / 58 / 0
Регистрация: 29.01.2013
Сообщений: 254
Записей в блоге: 1
29.12.2013, 16:46
Нет, цвета вершин все-таки и у меня отображаются неправильно, но по-другому. Нулевая (верхняя) вершина правильного цвета - aqua, но зато чередование других вершин происходит в обратном порядке, как если бы обход был по часовой стрелке.
Вот если использовать функции определения матриц проекции и вида для ПРАВОЙ системы координат: Matrix.PerspectiveFovRH и Matrix.LookAtRH,- тогда всё правильно, вершины чередуются ПРОТИВ часовой стрелки. Чушь какая-то, всё наоборот!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2013, 16:46
Помогаю со студенческими работами здесь

Не отображается цвет в datagridview
Может кто знает.Уже 2 дня сижу никак не могу разобраться. Накидал похожий пример (ниже). Эти 2 грида на разных вкладках tabcontrol. При...

DirectX текстура рисуется неправильно
Всем привет! подскажите как избавиться от этого ???? я уже немогу и так и сяк пробовал ну никак! загружаю текстуру...

Неправильно отображается
Есть три параллелепипеда, которые вращаются, и возникает проблема. В одном и том же месте проваливаются полигоны. Вот скрины: | void...

Неправильно отображается текст
помогите пожалуйста вот код программы @echo off cls title Бдыщ color f0 mode con:cols=41 lines=15 :start echo Текст echo ...

Неправильно отображается картинка
Подскажите пожалуйста нубасу, что в этом коде мешает нормально отображаться картинке sassets/images/knopka_so_slovami.jpg ? // build the...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru